数据库链接池clearpool(java实现)详解

clearpool的maven项目托管在https://github.com/xionghuiCoder/clearpool,同时也能够在http://www.oschina.net/p/clearpool上了解它的简单介绍。java

首先你们可能会问,如今开源社区已经有了不少数据库链接池:c3p0、proxool、dbcp、bonecp、druid和tomcat_jdbc等,咱们还须要从新发明轮子么?是的,上面这些链接池都很是优秀,而且都有本身优势:好比高并发时druid和tomcat_jdbc近乎完美的性能,再好比proxool和druid的监控功能;然而它们并非完美的,好比性能是否还能再提高、如何管理分布式数据库、如何支持分布式事务。好的,下面就来介绍下clearpool以及它是如何支持这些功能的。git

一、如何使用clearpool

clearpool提供的接口类为ClearPoolDataSource.java。github

这里说下clearpool和其它数据库池的不一样的地方:web

1)它放弃了最小链接池数(min-pool-size),取而代之的是核心链接池数(core-pool-size),相似于java线程池ThreadPoolExecutor;sql

2)它不提供返回真实链接的方法,ClearPoolDataSource.java的getConnection()方法返回的是数据库链接的代理,除非利用反射机制(不建议这么作),否则不能真正操做数据库链接;这么作的缘由请参考3);数据库

3)它不会在获取链接时测试链接是否有效,由于这个操做可能会很是耗时(好比须要远程调用);这是由于它并不会返回真实的链接,因此就不用担忧会不当心关闭链接等意外状况。编程

二、如何配置DataSource

clearpool提供四种数据源配置方式:tomcat

1)直接设置dataSource;并发

2)配置jndi;maven

3)配置JDBC;

4)设置DataSourceHolder.java,使用DataSourceHolder.setDataSourceMap()方法来配置(key为数据库池名称name一致,value为DataSource);

clearpool支持三种数据源:ConnectionPoolDataSource、XADataSource和DataSource。

若是须要支持分布式事务则须要配置XADataSource或者支持XA协议的JDBC。

三、clearpool的性能

根据测试结果:druid和tomcat_jdbc的性能是很是优秀的,在某些高并发的状况下它俩的性能要比其它的链接池高上十倍甚至是几十倍。下图显示了clearpool和druid、tomcat_jdbc的性能比较结果(最大链接数为50、核心链接数为20、线程数为100):

  

上图的测试结果来自于:https://github.com/xionghuiCoder/clearpool/blob/master/src/test/java/com/github/xionghuicoder/clearpool/testcase/CompareWithWonderfulPool.java,若是想了解和其它数据库的性能比较结果请运行测试类:https://github.com/xionghuiCoder/clearpool/blob/master/src/test/java/com/github/xionghuicoder/clearpool/testcase/CompareWithPopularPool.java

四、管理分布式数据库池和JTA

clearpool能够管理分布式数据库,配置分布式链接池时咱们须要作的是配置多个数据源。clearpool会根据配置自动管理全部链接池:好比多余空闲链接的回收、无效链接的重置、数据库池的监控等等。clearpool还提供了支持JTA的接口类:UserTransactionImpl.java,咱们能够像下面这样使用分布式事务(con1和con2取自数据库链接池):

UserTransaction tx = new UserTransactionImpl();    
Statement st1 = con1.createStatement();     
Statement st2 = con2.createStatement();     
tx.begin();     
try{     
    st1.execute(“insert**”);     
    st2.execute(“update**”);     
    tx.commit();     
}catch(Throwable t){     
    tx.rollback();     
}

五、如何监控数据库链接池

clearpool经过JMX来实现数据库池的监控功能,而druid和proxool则是使用servlet实现;然而JMX的可编程性并无servlet好,这里放弃servlet是考虑到可能有的用户并不须要web容器,若是为了监控数据库池而让他们专门搭建个web环境是不公平的。

若是想要使得clearpool监控数据库链接池,则须要配置ClearPoolDataSource的Console字段,咱们能够经过console的port配置端口、经过console的securityMap配置用户名和密码,详细监控功能可参考测试用例https://github.com/xionghuiCoder/clearpool/blob/master/src/test/java/com/github/xionghuicoder/clearpool/testcase/UniqueFunction.java。下面是监控页面的部分截图:

若是须要打印sql,则须要设置ClearPoolDataSource的setShowSql()方法,同时须要启用日志功能(classpath中加入commons-logging.jar便可),下面是查询代码、打印的sql和sql耗时的截图:

PreparedStatement stmt = conn.prepareStatement("select 1 from geek where name=? and age=?");
stmt.setString(1, "Bill Joy");
stmt.setInt(2, 60);
stmt.execute();
stmt.close();

 

六、如何加密数据库密码

若是想要加密解密配置文件中的数据库密码,能够配置ConfigurationVO的securityClassName来解密密码。

七、其它

clearpool代码量十分地少,很是易于使用,相信你能很是快地熟练使用。

PS:clearpool支持JDK6 or JDK6+。

相关文章
相关标签/搜索