手写数据库连接池

引言

最近一直在写毕业设计,发现用户注册的时候并不快,尤其是每次都要在数据库中添加用户的信息,都能感受到稍微慢一点,于是百度,了解到,慢的原因是因为使用JDBC连接数据库时,每次都要创建Connection对象和销毁Connection对象,这个过程是最浪费时间的,所以我就想到了每次只要先创建一堆Connection对象,最后在集中销毁不就可以了吗?

开始操作:

  1. 首先,我们要用到的东西有监听器,JDBC工具类.
  2. 先说一下监听器吧,我选择ServletContextListener,原因是每次启动服务器的时候,都会创建一个全局作用域对象,这个接口中的contentinitlize():方法能够检测全局作用域被Http服务器初始化并调用,当全局作用域被创建出来的时候,我们这个方法就会自动运行,所以我们在这个方法里面创建20个Connection对象,并存储到map集合中
  3. 这时候问题来了,存储到集合中,但是集合只是一个局部变量,我们是无法获取到的,这时候我想到了将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();
            }
        }
     }
    }
}
  1. 这样我们就有了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对象
这样的话我们的连接池就基本完成了

上一篇:数据库操作实例


下一篇:Nitrous.IO融资665万美元 帮助开发者省去配置调试等工作-CSDN.NET