我们用 JDBC 操作数据库的时候,每次操作完都会将连接关闭。数据库连接是极其宝贵的资源,频繁的创建和销毁会极大地降低服务器的性能。因此,我们可以利用池化技术,重复利用数据库资源,避免没必要的开销。
用口语来说,相当于我们创建了一个池子,这个池子里面放的都是一些JDBC的连接,也就是Connection对象,每当我们需要时,我们去从连接池里面获取连接,使用完了连接,放回连接池,做到连接的反复使用。
手写一个数据库连接池
思路:
- 要实现DataSource接口(SUN公司就制定的连接池的标准)
- 要有一个getConnection()方法用来获取连接池中的connection对象
- 连接池中的connection对象有进有出,所以把他们放入队列使用起来是比较方便的
- 当connection对象调用close()方法的时候不应该关闭连接池,而是要把连接放回连接池中,所以我们要自建一个连接对象(通过实现connection接口)
伪代码如下:
重写close():
public class MyWrapperConnection implements Connection{
// 维护一个Connection对象,重写除close()以外的方法我们直接用Connection对象的方法
private Connection connection;
// 维护一个队列用来
private LinkedList<Connection> queue;
// 无参构造
public MyWrapperConnection() {
}
// 有参构造
public MyWrapperConnection(Connection connection, LinkedList<Connection> linkedList) {
this.connection = connection;
this.linkedList = linkedList;
}
//重写close()方法
@Override
public void close() throws SQLException {
// 用完放回队列
queue.offer(this);
}
构建连接池:
public class MyConnectionPool implements DataSource {
// 得用一个数据结构去存放连接
static LinkedList<Connection> queue;
static {
init(10);
}
// 往连接池里面放连接的方法
private static void init(int num) {
if (connectionPool == null) {
connectionPool = new LinkedList<>();
}
for (int i = 0; i < num; i++) {
// 添加一个连接
Connection connection = JDBCUtils.getConnection();
MyWrapperConnection myWrapperConnection = new MyWrapperConnection(connection, queue);
connectionPool.addFirst(myWrapperConnection)