【連線池】Tomcat 連線池中 maxActive,maxWait,maxAge,testOnBorrow,testWhileIdle等選項的作用
前言
連線池本質作用是為客戶端提供連線複用,提升連線效率,降低系統開銷。Tomcat的連線池提供了maxActive,maxWait,maxIdle,minIdle,initialSize等引數,配置連線池的大小,使用者根據自身業務需求配置這幾個引數。同時,因為對端資料庫伺服器狀態不受tomcat控制,所以tomcat需要有檢查連線可用性的機制,通過testOnBorrow,testWhileIdle等選項使用者可以告訴tomcat是否檢查連線可用性以及如何檢查。
1,連線池大小及效能選項
maxActive
:最主要引數,配置連線池同時能維持的最大連線數,如果客戶端理論上需要100個連線,則這個值設為100。
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&characterEncoding=utf-8&disableMariaDbDriver"/>