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

原创
2014/08/20 01:15
阅读数 1.2W

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

首先大家可能会问,现在开源社区已经有了很多数据库连接池:c3p0、proxool、dbcp、bonecp、druid和tomcat_jdbc等,我们还需要重新发明轮子么?是的,上面这些连接池都非常优秀,并且都有自己优点:比如高并发时druid和tomcat_jdbc近乎完美的性能,再比如proxool和druid的监控功能;然而它们并不是完美的,比如性能是否还能再提升、如何管理分布式数据库、如何支持分布式事务。好的,下面就来介绍下clearpool以及它是如何支持这些功能的。

1、如何使用clearpool

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

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

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

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

3)它不会在获取连接时测试连接是否有效,因为这个操作可能会非常耗时(比如需要远程调用);这是因为它并不会返回真实的连接,所以就不用担心会不小心关闭连接等意外情况。

2、如何配置DataSource

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

1)直接设置dataSource;

2)配置jndi;

3)配置JDBC;

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

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

如果需要支持分布式事务则需要配置XADataSource或者支持XA协议的JDBC。

3、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

4、管理分布式数据库池和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();     
}

5、如何监控数据库连接池

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();

 

6、如何加密数据库密码

如果想要加密解密配置文件中的数据库密码,可以配置ConfigurationVO的securityClassName来解密密码。

7、其它

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

PS:clearpool支持JDK6 or JDK6+。

 

展开阅读全文
打赏
12
147 收藏
分享
加载中

引用来自“闲.大赋”的评论

看着不错,最好加上日志分析的,或者留出一个接口可以供日志分析

引用来自“xionghui_soft”的评论

谢谢你的建议,日志分析是指在运行过程中记录数据库池状态么?可以再稍微详细介绍下么。 其实clearpool是支持commons-logging和log4j的,只要在classpath中引入commons-logging.jar和log4j.jar并配置log4j.properties就能输出日志到任何地方了,而不仅仅像上面打印sql那样输出在控制台了。
主要是只sql日志,执行了什么sql,花了多长时间,可以利于做性能,也可以做一些统计,类似druid那种
2014/08/21 08:38
回复
举报

引用来自“抓瓦工人”的评论

3)它不会在获取连接时测试连接是否有效

对于mysql这种8小时候自动关闭链接,怎么处理!
其实我也考虑过这个问题,如果需要测试连接的话可以配置keep-test-period,这样会启动一个线程,并会检查连接池内的连接是否失效,若失效,它会尝试从数据源获取新的连接。keep-test-period配置的是测试连接的间隔时间,只有在连接池内的连接的空闲时间超过了配置的时间才会去测试连接。这样会比每次获取连接时测试连接要高效一些。
2014/08/20 20:47
回复
举报
3)它不会在获取连接时测试连接是否有效

对于mysql这种8小时候自动关闭链接,怎么处理!
2014/08/20 20:01
回复
举报
好小的体积,我喜欢
2014/08/20 19:38
回复
举报

引用来自“Wendal”的评论

先围观, 晚上跑跑nutz的testcase
好的,多谢支持,如果有疑问或发现问题请留言或向我发邮件,我会第一时间解决和回复的。
2014/08/20 18:48
回复
举报

引用来自“haitaosoft”的评论

应该标题里写清楚:java的数据库连接池clearpool


北京公司招人,往往不写地点;java是不是也像北京那样主流得可以缺省了?
不好意思,刚刚完善了下标题。
2014/08/20 17:50
回复
举报
先围观, 晚上跑跑nutz的testcase
2014/08/20 17:33
回复
举报
应该标题里写清楚:java的数据库连接池clearpool


北京公司招人,往往不写地点;java是不是也像北京那样主流得可以缺省了?
2014/08/20 15:38
回复
举报

引用来自“心中彩虹”的评论

能否支持.net平台上使用?
sorry,应该不行,它是纯java开发的,需要在jdk平台上运行。
2014/08/20 13:54
回复
举报
能否支持.net平台上使用?
2014/08/20 13:37
回复
举报
更多评论
打赏
16 评论
147 收藏
12
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部