对于连接池技术,应该有所了解,现在对这几天对连接池的学习进行下记录。
连接池,负责管理,分配和释放数据库连接,它允许一个应用程序重复使用一个现有的数据连接,而不是重新建立一个。释放空闲时间超过最大空闲时间的数据库连接来避免没有释放数据库而导致的是句酷连接泄露。百度百科是这样说,大家都知道,在进行相关操作的时候,以往都需要从数据库中获取一个新的连接,来以此进行相关操作,现在,数据库连接池可以在启动的时候事先创建一个存放数据库连接的池子,当需要的时候时,便可以从中获取一个,当不再用的时候可以,将这个连接对象放到池子中。以此来提高性能。
public class MyDataSource implements DataSource {
private static LinkedList<Connection> pool =(LinkedList<Connection>) Collections.synchronizedList( new LinkedList<Connection>());
static {
try {
for(int i=0;i<10;i++) {
Connection conn=Dbutils.getConnection();
pool.add(conn);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化数据库失败,检查配置文件是否正确");
}
}
@Override
public Connection getConnection() throws SQLException {
Connection conn = null;
if (pool.size() > 0) {
conn = pool.removeFirst();//从池中取出一个连接
return conn;
} else {
throw new RuntimeException("服务器忙");
}
}
需要注意的是,在取得连接的时候是从池子中第一个获取到的,那么,问题是,当我们用完这个对象后,是否还和以前一样直接将连接关闭呢?答案是不可以的,我们原先要做的是将用完的再放到池子当中,而如果直接的话,就是将连接关了。
解决方法是,使用装饰设计模式来对关闭操作进行处理。使用装饰设计模式进行需要有这几个步骤》》
- 编写一个类,实现与被包装类相同的接口,(具备相同的行为)
- 定义一个被包装类类型的变量
- 定义构造方法,将被包装类性的对象注入,给被包装类对象赋值
- 对于不需要的方法,调用原来的方法
- 对于需要的方法,写自己的代码
我们需要写的也就是对close方法进行修改。
这个类中实现了connection接口,并重写了方法,首先是对定义被包装类的变量,在这里也就是oldconn,和pool连接池,
写构造方法注入属性。注意关闭的方法,是addlast()。
接下来是数据源,创建连接池的类。
可以看到,先是创建了有10个连接对象的list,在getconnection中,先从list得到一个连接对象,然后调用myconnection类进行包装,此时得到的myconn不再是原先从list得到的conn,而是包装后的conn。
在close时候,也是调用myconnection方法中的close方法。
此时,conn.close()方法就可以放心关闭,而不用担心没有放回连接池子中。
注:其中有一些重写的方法没有在上面显示,那些不太需要,就没有写。用的时候只需要调用原来的方法就行了。