C3P0使用說明

1 C3P0簡介

      C3P0是一個開放源代碼的JDBC鏈接池,它在lib目錄中與Hibernate一塊兒發佈,包括了實現jdbc3和jdbc2擴展規範說明的 Connection 和Statement 池的DataSources 對象。 該項目主頁:http://sourceforge.net/projects/c3p0html

官方文檔: http://www.mchange.com/projects/c3p0/index.htmljava

 

2 C3P0 的配置

經過下面的屬性能夠對數據源進行各類有效的控制:數據庫

 

  • acquireIncrement:當鏈接池中的鏈接用完時,C3P0一次性建立新鏈接的數目;緩存

  • acquireRetryAttempts:定義在從數據庫獲取新鏈接失敗後重復嘗試獲取的次數,默認爲30;多線程

  • acquireRetryDelay:兩次鏈接中間隔時間,單位毫秒,默認爲1000;異步

  • autoCommitOnClose:鏈接關閉時默認將全部未提交的操做回滾。默認爲false;性能

  • automaticTestTable: C3P0將建一張名爲Test的空表,並使用其自帶的查詢語句進行測試。若是定義了這個參數,那麼屬性preferredTestQuery將被忽略。你 不能在這張Test表上進行任何操做,它將中爲C3P0測試所用,默認爲null;測試

  • breakAfterAcquireFailure:獲取鏈接失敗將會引發全部等待獲取鏈接的線程拋出異常。可是數據源仍有效保留,並在下次 調   用getConnection()的時候繼續嘗試獲取鏈接。若是設爲true,那麼在嘗試獲取鏈接失敗後該數據源將申明已斷開並永久關閉。默認爲 false;ui

  • checkoutTimeout:當鏈接池用完時客戶端調用getConnection()後等待獲取新鏈接的時間,超時後將拋出 SQLException,如設爲0則無限期等待。單位毫秒,默認爲0;編碼

  • connectionTesterClassName:經過實現ConnectionTester或QueryConnectionTester 的類來測試鏈接,類名需設置爲全限定名。默認爲 com.mchange.v2.C3P0.impl.DefaultConnectionTester;

  • idleConnectionTestPeriod:隔多少秒檢查全部鏈接池中的空閒鏈接,默認爲0表示不檢查;

  • initialPoolSize:初始化時建立的鏈接數,應在minPoolSize與maxPoolSize之間取值。默認爲3;

  • maxIdleTime:最大空閒時間,超過空閒時間的鏈接將被丟棄。爲0或負數則永不丟棄。默認爲0;

  • maxPoolSize:鏈接池中保留的最大鏈接數。默認爲15;

  • maxStatements:JDBC的標準參數,用以控制數據源內加載的PreparedStatement數量。但因爲預緩存的 Statement屬於單個Connection而不是整個鏈接池。因此設置這個參數須要考慮到多方面的因素,若是maxStatements與 maxStatementsPerConnection均爲0,則緩存被關閉。默認爲0;

  • maxStatementsPerConnection:鏈接池內單個鏈接所擁有的最大緩存Statement數。默認爲0;

  • numHelperThreads:C3P0是異步操做的,緩慢的JDBC操做經過幫助進程完成。擴展這些操做能夠有效的提高性能,經過多線程實 現多個操做同時被執行。默認爲3;

  • preferredTestQuery:定義全部鏈接測試都執行的測試語句。在使用鏈接測試的狀況下這個參數能顯著提升測試速度。測試的表必須在 初始數據源的時候就存在。默認爲null;

  • propertyCycle: 用戶修改系統配置參數執行前最多等待的秒數。默認爲300;

  • testConnectionOnCheckout:因性能消耗大請只在須要的時候使用它。若是設爲true那麼在每一個connection提交 的時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable

  • testConnectionOnCheckin:若是設爲true那麼在取得鏈接的同時將校驗鏈接的有效性。默認爲false。

 

3 C3P0的監控

C3P0做爲數據庫鏈接池的解決方案,被應用的很普遍。他對鏈接池監控也提供了接口。  
你只須要獲取要監控的datasource,就能經過c3p0提供的 com.mchange.v2.c3p0.PooledDataSource接口實現類來完成狀態的查詢。  
官方的doc中提供瞭如何獲取狀態的例子代碼:  
  view plaincopy to clipboardprint?  

DataSource ds = (DataSource) ictx.lookup( "java:comp/env/jdbc/myDataSource" );      
// make sure it's a c3p0 PooledDataSource       
if ( ds instanceof PooledDataSource)  
 
{       
    PooledDataSource pds = (PooledDataSource) ds;  
    System.err.println("num_connecti*****: " + pds.getNumConnecti*****DefaultUser());       
   System.err.println("num_busy_connecti*****: " +pds.getNumBusyConnecti*****DefaultUser());  
 
    System.err.println("num_idle_connecti*****: " +pds.getNumIdleConnecti*****DefaultUser());  
 
    System.err.println(); } elseSystem.err.println("Not a c3p0 PooledDataSource!");  
   DataSource ds = (DataSource) ictx.lookup( "java:comp/env/jdbc/myDataSource"  
 
);  
// make sure it's a c3p0 PooledDataSource  
if ( ds instanceof PooledDataSource) {  
     PooledDataSource pds = (PooledDataSource) ds;  
 
     System.err.println("num_connecti*****: " + pds.getNumConnecti*****DefaultUser());  
    System.err.println("num_busy_connecti*****: " +pds.getNumBusyConnecti*****DefaultUser());  
 
    System.err.println("num_idle_connecti*****: " +pds.getNumIdleConnecti*****DefaultUser());  
 
   System.err.println();  
} else  
 
System.err.println("Not a c3p0 PooledDataSource!");

  從上邊的代碼中能夠看出,只要獲取了系統的datasource應用就能夠知道當前鏈接 池的狀態了。 對於單個數據源的系 統來講,這種方式顯然是很奏效的。 可是同 時咱們可能面臨在一個JVM上有多個C3P0數據庫鏈接池。這個時候咱們該如何處理呢?若是咱們只是統計總體的一個狀態,那也無需擔憂,可是若是咱們須要 對每一個建立的鏈接池進行統計,那麼就須要咱們給每一個C3P0鏈接池打上記號了。這裏官方文檔說能夠給每一個datasouce指定 dataSourceName,未來根據dataSourceName來指定咱們到底要查詢的是哪一個數據庫鏈接池的狀態。詳細參見 「UsingC3P0Registry to get a reference to aDataSource」,這裏反覆強調了各個鏈接池的惟一性能夠經過dataSourceName來標記。    咱們在編碼上記住,經過指定惟一性標記來完成對C3P0鏈接池的辨認。以此來完成 C3P0多數據源的狀態統計

相關文章
相關標籤/搜索