数据库链接池的原理

一.早期咱们怎么进行数据库操做java

1.原理:通常来讲,Java应用程序访问数据库的过程是:git

   ①装载数据库驱动程序;程序员

   ②经过jdbc创建数据库链接;github

   ③访问数据库,执行sql语句;web

   ④断开数据库链接。sql

 

 

2.分析数据库

 

       程序开发过程当中,存在不少问题:首先,每一次web请求都要创建一次数据库链接。创建链接是一个费时的活动,每次都得花费0.05s1s的时间,并且系统还要分配内存资源。这个时间对于一次或几回数据库操做,或许感受不出系统有多大的开销。但是对于如今的web应用,尤为是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种状况下,频繁的进行数据库链接操做势必占用不少的系统资源,网站的响应速度一定降低,严重的甚至会形成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库链接,使用完后都得断开。不然,若是程序出现异常而未能关闭,将会致使数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被建立的链接对象数,系统资源会被毫无顾及的分配出去,如链接过多,也可能致使内存泄漏,服务器崩溃。apache

 

3.解决:设计模式

对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所形成的问题。为解决上述问题,能够采用数据库链接池技术。数据库链接池的基本思想就是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完毕以后再放回去。咱们能够经过设定链接池最大链接数来防止系统无尽的与数据库链接。更为重要的是咱们能够经过链接池的管理机制监视数据库的链接的数量﹑使用状况,为系统开发﹑测试及性能调整提供依据。服务器

 

咱们本身尝试开发一个链接池,来为上面的查询业务提供数据库链接服务:

       ①   编写class 实现DataSource 接口

       ②   class构造器一次性建立10个链接,将链接保存LinkedList

       ③   实现getConnection  LinkedList返回一个链接

       ④   提供将链接放回链接池中方法

 

       1、链接池代码

  1. public class MyDataSource implements DataSource {  
  2.           //链表 --- 实现栈结构  
  3.           privateLinkedList<Connection> dataSources = new LinkedList<Connection>();  
  4.   
  5.           //初始化链接数量  
  6.           publicMyDataSource() {  
  7.                  //一次性建立10个链接  
  8.                  for(int i = 0; i < 10; i++) {  
  9.                         try {  
  10.                            //一、装载sqlserver驱动对象  
  11.                            DriverManager.registerDriver(new SQLServerDriver());  
  12.                            //二、经过JDBC创建数据库链接  
  13.                            Connection con =DriverManager.getConnection(  
  14.                               "jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");  
  15.                            //三、将链接加入链接池中  
  16.                            dataSources.add(con);  
  17.                         } catch (Exception e) {  
  18.                            e.printStackTrace();  
  19.                         }  
  20.                  }  
  21.           }  
  22.   
  23.           @Override  
  24.           publicConnection getConnection() throws SQLException {  
  25.                  //取出链接池中一个链接  
  26.                  finalConnection conn = dataSources.removeFirst(); // 删除第一个链接返回  
  27.                  returnconn;  
  28.           }  
  29.   
  30.           //将链接放回链接池  
  31.           publicvoid releaseConnection(Connection conn) {  
  32.                  dataSources.add(conn);  
  33.                  }  
  34.    } 

 

2、使用链接池重构咱们的用户查询函数       

  1. //查询全部用户  
  2. Public void FindAllUsers(){  
  3.        //一、使用链接池创建数据库链接  
  4.        MyDataSource dataSource = new MyDataSource();  
  5.        Connection conn =dataSource.getConnection();          
  6.        //二、建立状态  
  7.        Statement state =con.createStatement();             
  8.        //三、查询数据库并返回结果  
  9.        ResultSet result =state.executeQuery("select * from users");             
  10.        //四、输出查询结果  
  11.        while(result.next()){  
  12.               System.out.println(result.getString("email"));  
  13.        }              
  14.        //五、断开数据库链接  
  15.        result.close();  
  16.        state.close();  
  17.        //六、归还数据库链接给链接池  
  18.        dataSource.releaseConnection(conn);  
  19.  }  

 

       这就是数据库链接池的原理,它大大提供了数据库链接的利用率,减少了内存吞吐的开销。

 

 

3.实际开发中有成熟的开源链接池供咱们使用

 

       理解了链接池的原理就能够了,没有必要什么都从头写一遍,那样会花费不少时间,而且性能及稳定性也不必定知足要求。事实上,已经存在不少流行的性能优良的第三方数据库链接池jar包供咱们使用。如:

 

       1.Apache commons-dbcp 链接池

 

        下载:http://commons.apache.org/proper/commons-dbcp/

 

 

 

       2.c3p0 数据库链接池

 

        下载:http://sourceforge.net/projects/c3p0/

 

 

 

4.实际开发推荐

介绍:https://github.com/alibaba/druid/wiki/

Druid是阿里巴巴开源平台上的一个项目,基于Apache License 2.0协议开源,代码托管在GitHub。整个项目由数据库链接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可让程序员实现一些特殊的需求,好比向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员能够经过定制来实现本身须要的功能。

 

 

转载:http://blog.csdn.net/shuaihj/article/details/14223015

相关文章
相关标签/搜索