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

主宰稳场 提交于 2019-12-02 00:05:54

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+。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!