引言
最近一直在写毕业设计,发现用户注册的时候并不快,尤其是每次都要在数据库中添加用户的信息,都能感受到稍微慢一点,于是百度,了解到,慢的原因是因为使用JDBC连接数据库时,每次都要创建Connection对象和销毁Connection对象,这个过程是最浪费时间的,所以我就想到了每次只要先创建一堆Connection对象,最后在集中销毁不就可以了吗?
开始操作:
- 首先,我们要用到的东西有监听器,JDBC工具类.
- 先说一下监听器吧,我选择ServletContextListener,原因是每次启动服务器的时候,都会创建一个全局作用域对象,这个接口中的contentinitlize():方法能够检测全局作用域被Http服务器初始化并调用,当全局作用域被创建出来的时候,我们这个方法就会自动运行,所以我们在这个方法里面创建20个Connection对象,并存储到map集合中
- 这时候问题来了,存储到集合中,但是集合只是一个局部变量,我们是无法获取到的,这时候我想到了将map集合传给全局变量application
代码如下:
public class One implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
JdbcUtil util = new JdbcUtil();
Map map= new HashMap();
//全局作用域对象被创建
//我们需要创建20个Connection
for(int i = 0 ;i<20 ;i++) {
Connection con = util.getCon();
System.out.println("conn对象"+con+"被创建了");
map.put(con,true);//当con对应的为true时候,说明是空闲的
}
//将map存放到全局作用域对象中
ServletContext application = sce.getServletContext();
application.setAttribute("key1",map);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//在服务器关闭的时候,将Conn统一销毁
ServletContext application = sce.getServletContext();
Map map = (HashMap)application.getAttribute("key1");
Iterator it = map.keySet().iterator();
while (it.hasNext()){
Connection con = (Connection) it.next();
if(con!= null){
System.out.println("Con销毁了!");
try {
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
- 这样我们就有了20个可以使用的Con对象了,那我们该如何去调用它们?答案是,先从全局作用对象拿到map集合,其次在遍历
代码如下:
//封装连接通道创建细节
public Connection getCon(HttpServletRequest request){
ServletContext application = request.getServletContext();
Map map = (HashMap)application.getAttribute("key1");
//从map中得到一个空闲的con
Iterator it = map.keySet().iterator();
while (it.hasNext()){
con = (Connection) it.next();
boolean flag = (boolean) map.get(con);
if(flag == true){
map.put(map,false);
break;
}
return con;
}
这是从map集合中依次取出,直到找出一个为true 的con对象
这样的话我们的连接池就基本完成了