开源数据库链接池之DBCP

  本篇介绍几种开源数据库链接池,同时重点讲述如何使用Apache公司的的DBCP数据库链接池。html

  前面一篇博客已经重点讲述了使用数据库链接池的好处,便是将屡次建立链接转变为一次建立而使用长链接模式。这样能减小数据库建立链接的消耗。正是因为数据库链接池的思想很是重要,因此市面上也有不少开源的数据库链接池供咱们使用。主要有如下三个:java

  DBCP数据库链接池mysql

  C3P0 数据库链接池web

  Tomcat内置的数据库链接池(DBCP)sql

  本篇主要讲述DBCP数据库链接池的使用,关于另外两个数据库链接池的用法请看《开源数据库链接池之C3P0》 、《开源数据库链接池之Tomcat内置链接池》 。若是咱们使用这些开源的数据库链接池,咱们就能够省略像前一篇博客中本身建立数据库链接池的步骤,这样会省略咱们不少事。数据库

  DBCP是Apache软件基金组织下的开源链接池的实现,使用DBCP数据源,须要在咱们的web工程中添加如下两个开源jar包:apache

  ·Commons-dbcp.jaride

  ·Commons-pool.jar工具

  到如今为止,DBCP和POOL已经都已经升为DBCP2和POOL2,DBCP2.x和DBCP1.x并不兼容,用户应该注意在使用DBCP配置文件上的选项可能发生了改变(如maxAction变成了maxTotal)等等。学习

  对于使用开源数据库链接池,最重要的就是如何设置配置文件中的配置信息,Apache官网中提供了最新版的DBCP2.1.1的配置关键词和其做用:http://commons.apache.org/proper/commons-dbcp/configuration.html 咱们能够从这个网页中的表格里拾取咱们须要的有用的配置参数。

  但在本例中我并不打算使用最新版的DBCP2,而是使用DBCP1.4。

 

例:简单地使用DBCP数据库链接池

  建立工程JdbcPoolLearning,添加咱们的commons-dbcp-1.4.jar包和commons-pool-1.6.jar包,固然别忘了数据库驱动jar包:

  

接着在工程的【src】目录下放置咱们的配置文件dbcpconfig.properties,配置文件内容以下:

#链接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root

#<!-- 初始化链接 -->
initialSize=10

#最大链接数量
maxActive=50

#<!-- 最大空闲链接 -->
maxIdle=20

#<!-- 最小空闲链接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动创建链接时附带的链接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,所以这里不须要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8

#指定由链接池所建立的链接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由链接池所建立的链接的只读(read-only)状态。
#若是没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由链接池所建立的链接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED

  上面是配置文件中的配置参数,固然咱们只选取部分的参数便可知足咱们demo的演示,若是在实际开发过程当中须要使用到DBCP更多的功能,能够本身再在这份配置文件上添加上配置参数,配置参数能够从http://commons.apache.org/proper/commons-dbcp/configuration.html该网站上获取,但要注意这是DBCP2版本的配置参数,部分和DBCP1.x的参数命名不一样。

  一般咱们会将获取链接做为一个工具类,如《JDBC操做数据库的学习(2)》中的JdbcUtils工具类同样,但咱们知道,如今咱们要想获取链接再也不是直接从数据库建立而来,而是从链接池中获取,所以JdbcUtils工具类获取链接的方法getConnection就跟之前不一样了,代码以下:

 1 public class JdbcUtils {       //JDBC工具类
 2     private static Properties config;  3     private static DataSource ds ;  4     static{  5         InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");   //将配置文件以流的形式返回
 6         try {  7             config = new Properties();  8             config.load(in);  //加载配置文件
 9             ds = BasicDataSourceFactory.createDataSource(config); //根据配置文件建立链接池
10             
11         } catch (Exception e) { 12             throw new ExceptionInInitializerError(e); 13  } 14  } 15     
16     public static Connection getConnection() throws SQLException { 17         return ds.getConnection();   //获取链接
18  } 19     
20     public static void release(Connection conn,Statement st,ResultSet rs) {   //释放资源的代码仍是跟之前同样
21         if(rs!=null) { 22             try{ 23  rs.close(); 24             }catch (Exception e) { 25  e.printStackTrace(); 26  } 27             rs = null; 28  } 29         if(st!=null) { 30             try{ 31  st.close(); 32             }catch (Exception e) { 33  e.printStackTrace(); 34  } 35             st = null; 36  } 37         if(conn!=null) { 38             try{ 39  conn.close(); 40             }catch (Exception e) { 41  e.printStackTrace(); 42  } 43             conn = null; 44  } 45  } 46 }
View Code

  经过以上步骤,就已经使用DBCP建立好了一个数据库链接池,很简单吧。全部咱们须要修改的功能参数只要在配置文件里面修改便可。这个工具类和之前的工具类大体仍是相似的,区别在于不须要人为地使用Class.forname方法加载数据库驱动,全部的一切,如加载数据库驱动,加载数据库URL,加载数据库用户名和密码都只要经过配置文件和DBCP的BasicDataSourceFactory对象便可解决。

  DBCP最大的特色在于能够直接使用Properties对象直接将配置信息经过BasicDataSourceFactory工厂对象的createDataSource方法设置配置文件中的各个参数。

  一样咱们看到释放资源的代码跟之前仍是相同的,一点都没改变,这也间接地说明了在这个JdbcUtils工具类中的release方法中的Connection的close方法其实根本不会调用,即便咱们在别的方法中调用了某个链接Connection对象的close方法,其实也是被DBCP覆写的close方法,这跟咱们上一篇自定义数据库链接池的方法是相似的,换句话说,由DBCP跟咱们的链接对象根本不是数据库直接提供给咱们的Connection对象,而是通过包装或者动态代理设计后的Connection对象,至于使用了哪一种加强方式,这个要看是什么开源的数据库链接了,咱们能够对上面的代码小小测试一下:

 1 public void testConnection() throws SQLException {  2         Connection conn = null;  3         PreparedStatement st = null;  4         ResultSet rs = null;  5         
 6         try{  7             conn = JdbcUtils.getConnection();  8  System.out.println(conn);  9  System.out.println(conn.getClass().getName()); 10         }finally{ 11  JdbcUtils.release(conn, st, rs); 12  } 13 }
View Code

在控制台上的效果以下:

  

  能够看到DBCP返回给咱们的链接实际上是一个包装后的Connection对象,不用说也知道这个包装的Connection对象确定覆写了close方法,以使咱们在释放资源时能将链接从新啊返回到DBCP的链接池中。

相关文章
相关标签/搜索