數據庫鏈接池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+。

相關文章
相關標籤/搜索