1. 程式人生 > >【連線池】Tomcat 連線池中 maxActive,maxWait,maxAge,testOnBorrow,testWhileIdle等選項的作用

【連線池】Tomcat 連線池中 maxActive,maxWait,maxAge,testOnBorrow,testWhileIdle等選項的作用

前言

連線池本質作用是為客戶端提供連線複用,提升連線效率,降低系統開銷。Tomcat的連線池提供了maxActive,maxWait,maxIdle,minIdle,initialSize等引數,配置連線池的大小,使用者根據自身業務需求配置這幾個引數。同時,因為對端資料庫伺服器狀態不受tomcat控制,所以tomcat需要有檢查連線可用性的機制,通過testOnBorrow,testWhileIdle等選項使用者可以告訴tomcat是否檢查連線可用性以及如何檢查。

1,連線池大小及效能選項

maxActive:最主要引數,配置連線池同時能維持的最大連線數,如果客戶端理論上需要100個連線,則這個值設為100。
maxIdle

:如果客戶端一段時間內不需要使用連線,如果一直把所有連線池中的所有連線都維持在活動狀態是很浪費資源的,maxIdle這個選項告訴tomcat,如果客戶端沒有需求,那麼最多維持maxIdle個空閒連線。
minIdle:和maxIdle類似,maxIdle告訴tomcat最多維持多少個空閒連線,minIdle告訴tomcat即使客戶端沒有需求,也要至少維持多少個空閒連線,以應對客戶端的突發需求。
initialSize:連線池啟動時要初始化多少個連線,即使客戶端這是沒有需求,也會初始化空閒連線。
maxWait:連線池出借連線的最長期限,單位是毫秒,比如設為10000ms,客戶端從連線池獲取(借出)一個連線後,10000毫秒沒有歸還(return),則連線池會丟擲異常。
maxAge
:連線池中一個連線的壽命,連線池初始化一個連線後,會記下初始化的時間,以後每次出借,或有客戶端歸還這個連線時,連線池會檢查 當前時間 - 初始化時間 > maxAge,如果超過maxAge,連線池會刪除這個連線。

2,連線檢查選項

mysql5以後,如果連線長時間不活動 (34,247,052 ms≈ 9.5 小時),mysql資料庫會斷開連線,這會導致異常:MySQLNonTransientConnectionException: No operations allowed after connection closed,以下選項將會告訴連線池,主動檢查連線可用性,避免這個異常發生。

validationQuery:檢查連線可用性的語句,一般來說mysql設定成SELECT 1, oracle設定成select 1 from dual, sql server設定成SELECT 1 ,在檢查連線可用性時,連線池會執行這些語句,如果返回結果不為空,則說明連線可用。
validationQueryTimeout:執行連線檢查語句時的超時時間。

上面兩個選項告訴連線池如何檢查連線有效性,下面幾個選項告訴連線池在何時檢查連線有效性

testOnConnect: 在連線初始化時執行連線可用性檢查
testOnBorrow:在借出連線時檢查連線可用性
testOnReturn:在客戶端歸還連線時檢查連線可用性
testWhileIdle:在檢查閒置連線時同時檢查連線可用性

3,一個典型的連線池設定

  <Resource name="jdbc/your-jndi-name" auth="Container" type="javax.sql.DataSource"
  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
  maxActive="30" 
  maxIdle="10" 
  minIdle="5" 
  maxWait="100000" 
  initialSize="5" 
  testWhileIdle="true"
  testOnBorrow="true" 
  testOnReturn="false" 
  validationQuery="SELECT 1" 
  validationInterval="30000" 
  timeBetweenEvictionRunsMillis="30000" 
  maxAge="14400000"
  username="your-username" password="your-password" 
  driverClassName="com.mysql.cj.jdbc.Driver" 
  url="jdbc:mysql://host-address:3306/your-db-name?useUnicode=true&amp;characterEncoding=utf-8&amp;disableMariaDbDriver"/>