備用:三大鏈接池的參數說明(轉)

1. Apache-DBCP

參數
描述
username
傳遞給JDBC驅動的用於創建鏈接的用戶名
 
password
傳遞給JDBC驅動的用於創建鏈接的密碼
url
傳遞給JDBC驅動的用於創建鏈接的URL
driverClassName
使用的JDBC驅動的完整有效的java 類名
connectionProperties
當創建新鏈接時被髮送給JDBC驅動的鏈接參數,格式必須是 [propertyName=property;]*
注意:參數user/password將被明確傳遞,因此不須要包括在這裏
 
參數
默認值
描述
defaultAutoCommit
true
鏈接池建立的鏈接的默認的auto-commit狀態
defaultReadOnly
driver default
鏈接池建立的鏈接的默認的read-only狀態. 若是沒有設置則setReadOnly方法將不會被調用. (某些驅動不支持只讀模式,好比:Informix)
defaultTransactionIsolation
driver default
鏈接池建立的鏈接的默認的TransactionIsolation狀態. 下面列表當中的某一個: (參考javadoc)
  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
defaultCatalog
 
鏈接池建立的鏈接的默認的catalog
參數
默認值
描述
initialSize
0
初始化鏈接:鏈接池啓動時建立的初始化鏈接數量,1.2版本後支持
maxActive
8
最大活動鏈接:鏈接池在同一時間可以分配的最大活動鏈接的數量, 若是設置爲非正數則表示不限制
maxIdle
8
最大空閒鏈接:鏈接池中允許保持空閒狀態的最大鏈接數量,超過的空閒鏈接將被釋放,若是設置爲負數表示不限制
minIdle
0
最小空閒鏈接:鏈接池中允許保持空閒狀態的最小鏈接數量,低於這個數量將建立新的鏈接,若是設置爲0則不建立
maxWait
無限
最大等待時間:當沒有可用鏈接時,鏈接池等待鏈接被歸還的最大時間(以毫秒計數),超過期間則拋出異常,若是設置爲-1表示無限等待


 
 
參數
默認值
描述
validationQuery
 
SQL 查詢,用來驗證從鏈接池取出的鏈接,在將鏈接返回給調用者以前.若是指定,則查詢必須是一個SQL SELECT而且必須返回至少一行記錄
testOnBorrow
true
指明是否在從池中取出鏈接前進行檢驗,若是檢驗失敗,則從池中去除鏈接並嘗試取出另外一個.
注意: 設置爲true後若是要生效,validationQuery參數必須設置爲非空字符串
testOnReturn
false
指明是否在歸還到池中前進行檢驗
注意: 設置爲true後若是要生效,validationQuery參數必須設置爲非空字符串
testWhileIdle
false
指明鏈接是否被空閒鏈接回收器(若是有)進行檢驗.若是檢測失敗,則鏈接將被從池中去除.
注意: 設置爲true後若是要生效,validationQuery參數必須設置爲非空字符串
timeBetweenEvictionRunsMillis
-1
在空閒鏈接回收器線程運行期間休眠的時間值,以毫秒爲單位. 若是設置爲非正數,則不運行空閒鏈接回收器線程
numTestsPerEvictionRun
3
在每次空閒鏈接回收器線程(若是有)運行時檢查的鏈接數量
minEvictableIdleTimeMillis
1000 * 60 * 30
鏈接在池中保持空閒而不被空閒鏈接回收器線程(若是有)回收的最小時間值,單位毫秒

 
參數
默認值
描述
poolPreparedStatements
false
開啓池的prepared statement 池功能
maxOpenPreparedStatements
不限制
statement 池可以同時分配的打開的statements的最大數量, 若是設置爲0表示不限制

這裏能夠開啓PreparedStatements. 當開啓時, 將爲每一個鏈接建立一個statement,而且被下面方法建立的PreparedStatements將被緩存起來:
    * public PreparedStatement prepareStatement(String sql)
    * public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
注意: 確認鏈接還有剩餘資源能夠留給其餘statement
 
參數
默認值
描述
accessToUnderlyingConnectionAllowed
false
控制PoolGuard是否允許獲取底層鏈接

若是允許則可使用下面的方式來獲取底層鏈接:
    Connection conn = ds.getConnection();
    Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();
    ...
    conn.close();

默認false不開啓, 這是一個有潛在危險的功能, 不適當的編碼會形成傷害.(關閉底層鏈接或者在守護鏈接已經關閉的狀況下繼續使用它).請謹慎使用,而且僅當須要直接訪問驅動的特定功能時使用.
注意: 不要關閉底層鏈接, 只能關閉前面的那個.
 
參數
默認值
描述
removeAbandoned
false
標 記是否刪除泄露的鏈接,若是他們超過了removeAbandonedTimout的限制.若是設置爲true, 鏈接被認爲是被泄露而且能夠被刪除,若是空閒時間超過removeAbandonedTimeout. 設置爲true能夠爲寫法糟糕的沒有關閉鏈接的程序修復數據庫鏈接.
removeAbandonedTimeout
300
泄露的鏈接能夠被刪除的超時值, 單位秒
logAbandoned
false
標記當Statement或鏈接被泄露時是否打印程序的stack traces日誌。被泄露的Statements和鏈接的日誌添加在每一個鏈接打開或者生成新的Statement,由於須要生成stack trace

若是開啓"removeAbandoned",那麼鏈接在被認爲泄露時可能被池回收. 這個機制在(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)時被觸發.
舉例當maxActive=20, 活動鏈接爲18,空閒鏈接爲1時能夠觸發"removeAbandoned".可是活動鏈接只有在沒有被使用的時間超過"removeAbandonedTimeout"時才被刪除,默認300.resultset中游歷不被計算爲被使用.
 在配置時,主要難以理解的主要有:removeAbandoned logAbandonedremoveAbandonedTimeoutmaxWait這四個參數,設置了rmoveAbandoned=true 那麼在getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的 ConnectionremoveAbandonedTimeout(默認300)中設置的秒數後沒有使用的Connection,激活回收機制好像是getNumActive()=getMaxActive()-2 :) 有點忘了。
  logAbandoned=true的話,將會在回收事件後,在log中打印出回收Connection的錯誤信息,包括在哪一個地方用了Connection卻忘記關閉了,在調試的時候頗有用。
  在這裏私人建議maxWait的時間不要設得太長,maxWait若是設置太長那麼客戶端會等待好久才激發回收事件。
  如下是個人配置的properties文件:
#
鏈接設置
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1 :1521:DBSERVER
jdbc.username=user
jdbc.password=pass
#<!-- 初始化鏈接 -->
dataSource.initialSize=10
#<!-- 最大空閒鏈接 -->
dataSource.maxIdle=20
#<!-- 最小空閒鏈接 -->
dataSource.minIdle=5
# 最大鏈接數量
dataSource.maxActive=50
# 是否在自動回收超時鏈接的時候打印鏈接的超時錯誤
dataSource.logAbandoned=true
# 是否自動回收超時鏈接
dataSource.removeAbandoned=true
# 超時時間(以秒數爲單位)
#
設置超時時間有一個要注意的地方,超時時間=如今的時間-程序中建立Connection的時間,若是 maxActive比較大,好比超過100,那麼removeAbandonedTimeout能夠設置長一點好比180,也就是三分鐘無響應的鏈接進行 回收,固然應用的不一樣設置長度也不一樣。
dataSource.removeAbandonedTimeout=180
#<!-- 超時等待時間以毫秒爲單位 -->
#maxWait
表明當Connection用盡了,多久以後進行回收丟失鏈接
dataSource.maxWait=1000
  如下是我在鏈接控制中調用的方法:
        Properties  dbProps=null;
  //下面的讀取配置文件能夠根據實際的不一樣修改
        dbProps = ConfigProperties.getInstance().getProperties("jdbc.properties");
        try {
         String driveClassName = dbProps.getProperty("jdbc.driverClassName");
         String url = dbProps.getProperty("jdbc.url");
         String username = dbProps.getProperty("jdbc.username");
         String password = dbProps.getProperty("jdbc.password");
         String initialSize = dbProps.getProperty("dataSource.initialSize");
         String minIdle = dbProps.getProperty("dataSource.minIdle");
         String maxIdle = dbProps.getProperty("dataSource.maxIdle");
         String maxWait = dbProps.getProperty("dataSource.maxWait");
         String maxActive = dbProps.getProperty("dataSource.maxActive");
           //
是否在自動回收超時鏈接的時候打印鏈接的超時錯誤
          boolean logAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.logAbandoned","false"))).booleanValue();
          // 是否自動回收超時鏈接
          boolean removeAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.removeAbandoned","false"))).booleanValue();
          // 超時時間(以秒數爲單位)
          int removeAbandonedTimeout = Integer.parseInt(dbProps.getProperty("dataSource.removeAbandonedTimeout","300"));
        
         dataSource = new BasicDataSource();
         dataSource.setDriverClassName(driveClassName);
         dataSource.setUrl(url);
         dataSource.setUsername(username);
         dataSource.setPassword(password);
         // 初始化鏈接數
         if(initialSize!=null)
          dataSource.setInitialSize(Integer.parseInt(initialSize));
         
         //
最小空閒鏈接
         if(minIdle!=null)
          dataSource.setMinIdle(Integer.parseInt(minIdle));
         // 最大空閒鏈接
         if(maxIdle!=null)
          dataSource.setMaxIdle(Integer.parseInt(maxIdle));
         
         //
超時回收時間(以毫秒爲單位)
         if(maxWait!=null)
          dataSource.setMaxWait(Long.parseLong(maxWait));
         
         //
最大鏈接數
         if(maxActive!=null){
          if(!maxActive.trim().equals("0"))
           dataSource.setMaxActive(Integer.parseInt(maxActive));
         }
         System.out.println("logAbandoned="+logAbandoned);
            dataSource.setLogAbandoned(logAbandoned);
         dataSource.setRemoveAbandoned(removeAbandoned);
         dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
         
         Connection conn = dataSource.getConnection();
         if(conn==null){
          log.error("
建立鏈接池時,沒法取得鏈接!檢查設置!!!");
         }else{
          conn.close();
         }
         log.error("
鏈接池建立成功!!!");
        }
        catch (Exception e) {
              log.error("
建立鏈接池失敗!請檢查設置!!!");
        }
Hibernate 支持DBCP包進行數據庫鏈接池的配置。簡要說明配置過程:
(
僅僅是我的摸索,若有問題,歡迎指點)
須要的包:
Commons-Pool
(下載地址:http://jakarta.apache.org/commons/pool/):提供一個通常對象池的接口,並且包含實現了一般池工具箱。
Commons-DBCP
(下載地址:http://jakarta.apache.org/commons/dbcp/):提供數據庫鏈接池服務。DBCP很聰明,把Commons-PoolJDBCdriver封裝起來,使達到鏈接池的目的。
Hibernate 屬性文件的配置參數
#
鏈接池的最大活動個數
hibernate.dbcp.maxActive 100
#
當鏈接池中的鏈接已經被耗盡的時候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增加)
hibernate.dbcp.whenExhaustedAction 1
#
最大等待時間
hibernate.dbcp.maxWait 120000
#
沒有人用鏈接的時候,最大閒置的鏈接個數。
hibernate.dbcp.maxIdle 10
##
如下是對prepared statement的處理,同上。
hibernate.dbcp.ps.maxActive 100
hibernate.dbcp.ps.whenExhaustedAction 1
hibernate.dbcp.ps.maxWait 120000
hibernate.dbcp.ps.maxIdle 10
## 可選,是否對池化的鏈接進行驗證
#
給出一條簡單的sql語句進行驗證
#hibernate.dbcp.validationQuery select 1 from dual
#
在取出鏈接時進行有效驗證
#hibernate.dbcp.testOnBorrow true
#
在放回鏈接時進行有效驗證
#hibernate.dbcp.testOnReturn false
#Hibernate 已經實現了DBCP Provider實現,別忘了在下面的鍵值去掉#字符
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider

  1. <property name="connection.pool.size">2</property>  
  2. <property name="statement_cache.size">25</property>  
  3. <property name="jdbc.fetch_size">50</property>  
  4. <property name="jdbc.batch_size">30</property>  
  5.   
  6. <property name="show_sql">true</property>  
  7. <property name="connection.provider_class">net.sf.hibernate.connection.DBCPConnectionProvider</property>  
  8. <property name="dbcp.maxActive">100</property>  
  9. <property name="dbcp.whenExhaustedAction">1</property>  
  10. <property name="dbcp.maxWait">120000</property>  
  11. <property name="dbcp.maxIdle">10</property>  
  12. <property name="dbcp.ps.maxActive">100</property>  
  13. <property name="dbcp.ps.whenExhaustedAction">1</property>  
  14. <property name="dbcp.ps.maxWait">120000</property>  
  15. <property name="dbcp.ps.maxIdle">100</property>  

2. C3P0

Ø C3P0的官方 example中使用的數據源爲 ComboPooledDataSource,網上一篇文章詳細介紹了 C3P0鏈接池配置中各項含義 [這些配置項的含義在下載解壓 c3p0的壓縮包以後目錄的 doc\index.html中的 Configuration部分也有詳細的介紹,這裏偷下懶 :P],現摘錄以下:
<c3p0-config>
<default-config>
<!-- 當鏈接池中的鏈接耗盡的時候c3p0 一次同時獲取的鏈接數。Default: 3 -->
<property name="acquireIncrement">3</property>

<!-- 定義在從數據庫獲取新鏈接失敗後重復嘗試的次數。Default: 30 -->
<property name="acquireRetryAttempts">30</property>

<!-- 兩次鏈接中間隔時間,單位毫秒。Default: 1000 -->
<property name="acquireRetryDelay">1000</property>

<!-- 鏈接關閉時默認將全部未提交的操做回滾。Default: false -->
<property name="autoCommitOnClose">false</property>

<!--c3p0 將建一張名爲Test 的空表,並使用其自帶的查詢語句進行測試。若是定義了這個參數那麼
屬性preferredTestQuery 將被忽略。你不能在這張Test 表上進行任何操做,它將只供c3p0 測試
使用。Default: null-->
<property name="automaticTestTable">Test</property>

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

<!-- 當鏈接池用完時客戶端調用getConnection() 後等待獲取新鏈接的時間,超時後將拋出
SQLException, 如設爲0 則無限期等待。單位毫秒。Default: 0 -->
<property name="checkoutTimeout">100</property>

<!-- 經過實現ConnectionTester QueryConnectionTester 的類來測試鏈接。類名需制定全路徑。
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
<property name="connectionTesterClassName"></property>

<!-- 指定c3p0 libraries 的路徑,若是(一般都是這樣)在本地便可得到那麼無需設置,默認null 便可
Default: null-->
<property name="factoryClassLocation">null</property>

<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.
(文檔原文)做者強烈建議不使用的一個屬性-->
<property name="forceIgnoreUnresolvedTransactions">false</property>

<!-- 60 秒檢查全部鏈接池中的空閒鏈接。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>

<!-- 初始化時獲取三個鏈接,取值應在minPoolSize maxPoolSize
 備一份:
 
 <!-- 數據源    BoneCP 鏈接池 -->  <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">     <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />     <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.6:1521:orcl" />     <property name="username" value="zfba"/>     <property name="password" value="zfba"/>     <property name="idleConnectionTestPeriod" value="60"/><!--檢查數據庫鏈接池中空閒鏈接的間隔時間,單位是分,默認值:240,若是要取消則設置爲0-->     <property name="idleMaxAge" value="60"/><!--鏈接池中未使用的連接最大存活時間,單位是分,默認值:60,若是要永遠存活設置爲0-->     <property name="maxConnectionsPerPartition" value="10"/><!--每一個分區最大的鏈接數 -->     <property name="minConnectionsPerPartition" value="1"/><!--每一個分區最小的鏈接數 -->     <property name="partitionCount" value="1"/><!--分區數,默認值2,最小1,推薦3-4,視應用而定  -->     <property name="acquireIncrement" value="2"/><!-- 當鏈接池中的鏈接耗盡的時候一次同時獲取的鏈接數。Default: 1 -->     <property name="statementsCacheSize" value="10"/><!--緩存prepared statements的大小,默認值:0 -->     <property name="releaseHelperThreads" value="3"/><!--每一個分區釋放連接助理進程的數量,默認值:3 -->  </bean>
相關文章
相關標籤/搜索