Tomcat-Jdbc-Pool配置及效能調優
阿新 • • 發佈:2019-01-24
1. maxActive="100"
表示併發情況下最大可從連線池中獲取的連線數。
2、maxIdle="30"
如果在併發時達到了maxActive=100,那麼連線池就必須從資料庫中獲取100個連線來供應用程式使用,當應用程式關閉連線後,由於maxIdle=30,因此並不是所有的連線都會歸還給資料庫,將會有30個連線保持在連線池種中,狀態為空閒。
maxIdle對應的連線,實際上是連線池保持的長連線,這也是連線池發揮優勢的部分,理論上講保持較多的長連線,在應用請求時可以更快的響應,但是過多的連線保持,反而會消耗資料庫大量的資源,因此maxIdle也並不是越大越好
3、minIdle=”2”
最小預設情況下並不生效,它的含義是當連線池中的連線少有minIdle,系統監控執行緒將啟動補充功能,一般情況下我們並不啟動補充執行緒。
4、removeAbandoned="true"
超過時間限制是否回收
5、removeAbandonedTimeout="60"
超時時間;單位為秒
6、logAbandoned="true"
關閉abanded連線時輸出錯誤日誌
有時粗心的程式編寫者在從連線池中獲取連線使用後忘記了連線的關閉,這樣連池的連線就會逐漸達到maxActive直至連線池無法提供服務。現代連線池一般提供一種“智慧”的檢查,但設定了removeAbandoned="true"時,當連線池連線數到達(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)時便會啟動連接回收,那種活動時間超過 removeAbandonedTimeout="60"的連線將會被回收,同時如果logAbandoned="true"設定為true,程式在回收連線的同時會列印日誌。removeAbandoned是連線池的高階功能,理論上這中配置不應該出現在實際的生產環境,因為有時應用程式執行長事務,可能這種情況下,會被連線池誤回收,該種配置一般在程式測試階段,為了定位連線洩漏的具體程式碼位置,被開啟,生產環境中連線的關閉應該靠程式自己保證。
一般會是幾種情況出現需要removeAbandoned:
1.程式碼未在finally釋放connection , 不過我們都用sqlmapClientTemplate,底層都有連結釋放的過程
2.遇到資料庫死鎖。以前遇到過後端儲存過程做了鎖表操作,導致前臺叢集中連線池全都被block住,後續的業務處理因為拿不到連結所有都處理失敗了。
7.initialSize
連線池啟動時建立的初始化連線數量(預設值為0)
8、maxWait
最大等待時間,當沒有可用連線時,連線池等待連線釋放的最大時間,超過該時間限制會丟擲異常,如果設定-1表示無限等待(預設為無限,調整為60000ms,避免因執行緒池不夠用,而導致請求被無限制掛起)
9、poolPreparedStatements
開啟池的prepared(預設是false,未調整,經過測試,開啟後的效能沒有關閉的好。)
10、maxOpenPreparedStatements
開啟池的prepared 後的同時最大連線數(預設無限制,同上,未配置)
11、minEvictableIdleTimeMillis
連線池中連線,在時間段內一直空閒,被逐出連線池的時間(預設為30分鐘,可以適當做調整,需要和後端服務端的策略配置相關)
12、minEvictableIdleTimeMillis
連線池中連線可空閒的時間,毫秒
13、timeBetweenEvictionRunsMillis
設定的Evict執行緒的時間,單位ms,大於0才會開啟evict檢查執行緒
timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用
每timeBetweenEvictionRunsMillis毫秒秒檢查一次連線池中空閒的連線,把空閒時間超過minEvictableIdleTimeMillis毫秒的連線斷開,直到連線池中的連線數到minIdle為止
14、testOnBorrow
顧明思義,就是在進行borrowObject進行處理時,對拿到的connection進行validateObject校驗
15、testOnReturn
顧明思義,就是在進行returnObject對返回的connection進行validateObject校驗,個人覺得對資料庫連線池的管理意義不大
16、testWhileIdle
關注的重點,GenericObjectPool中針對pool管理,起了一個Evict的TimerTask定時執行緒進行控制(可通過設定引數timeBetweenEvictionRunsMillis>0),定時對執行緒池中的連結進行validateObject校驗,對無效的連結進行關閉後,會呼叫ensureMinIdle,適當建立連結保證最小的minIdle連線數
17、validateQuery
代表檢查的sql,用來檢查連線是否有效的sql,要求是一個查詢語句,如果validateQuery為null,則testOnBorrow、testOnReturn、testWhileIdle 都不會起作用
18、validateQueryTimeout
代表在執行檢查時,通過statement設定,statement.setQueryTimeout(validationQueryTimeout)
19、numTestsPerEvictionRun
代表每次檢查連結的數量,建議設定和maxActive一樣大,這樣每次可以有效檢查所有的連結.
Java程式碼
minEvictableIdleTimeMillis,removeAbandonedTimeout這兩個引數針對的連線物件不一樣
minEvictableIdleTimeMillis針對連線池中的連線物件
removeAbandonedTimeout針對未被close的活動連線.
20、JdbcInterceptors
設定 tomcat jdbc 連線池的攔截器
內建的攔截器:
org.apache.tomcat.jdbc.pool.interceptor.ConnectionState
追蹤自動提交、只讀狀態、catalog和事務隔離等級等狀態
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer
追蹤開啟的statement,當連線被歸還時關閉它們.
多個攔截器用;分割,例如:
javapoolProps.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
表示併發情況下最大可從連線池中獲取的連線數。
2、maxIdle="30"
如果在併發時達到了maxActive=100,那麼連線池就必須從資料庫中獲取100個連線來供應用程式使用,當應用程式關閉連線後,由於maxIdle=30,因此並不是所有的連線都會歸還給資料庫,將會有30個連線保持在連線池種中,狀態為空閒。
maxIdle對應的連線,實際上是連線池保持的長連線,這也是連線池發揮優勢的部分,理論上講保持較多的長連線,在應用請求時可以更快的響應,但是過多的連線保持,反而會消耗資料庫大量的資源,因此maxIdle也並不是越大越好
3、minIdle=”2”
最小預設情況下並不生效,它的含義是當連線池中的連線少有minIdle,系統監控執行緒將啟動補充功能,一般情況下我們並不啟動補充執行緒。
4、removeAbandoned="true"
超過時間限制是否回收
5、removeAbandonedTimeout="60"
超時時間;單位為秒
6、logAbandoned="true"
關閉abanded連線時輸出錯誤日誌
有時粗心的程式編寫者在從連線池中獲取連線使用後忘記了連線的關閉,這樣連池的連線就會逐漸達到maxActive直至連線池無法提供服務。現代連線池一般提供一種“智慧”的檢查,但設定了removeAbandoned="true"時,當連線池連線數到達(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)時便會啟動連接回收,那種活動時間超過
一般會是幾種情況出現需要removeAbandoned:
1.程式碼未在finally釋放connection , 不過我們都用sqlmapClientTemplate,底層都有連結釋放的過程
2.遇到資料庫死鎖。以前遇到過後端儲存過程做了鎖表操作,導致前臺叢集中連線池全都被block住,後續的業務處理因為拿不到連結所有都處理失敗了。
7.initialSize
連線池啟動時建立的初始化連線數量(預設值為0)
8、maxWait
最大等待時間,當沒有可用連線時,連線池等待連線釋放的最大時間,超過該時間限制會丟擲異常,如果設定-1表示無限等待(預設為無限,調整為60000ms,避免因執行緒池不夠用,而導致請求被無限制掛起)
9、poolPreparedStatements
開啟池的prepared(預設是false,未調整,經過測試,開啟後的效能沒有關閉的好。)
10、maxOpenPreparedStatements
開啟池的prepared 後的同時最大連線數(預設無限制,同上,未配置)
11、minEvictableIdleTimeMillis
連線池中連線,在時間段內一直空閒,被逐出連線池的時間(預設為30分鐘,可以適當做調整,需要和後端服務端的策略配置相關)
12、minEvictableIdleTimeMillis
連線池中連線可空閒的時間,毫秒
13、timeBetweenEvictionRunsMillis
設定的Evict執行緒的時間,單位ms,大於0才會開啟evict檢查執行緒
timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用
每timeBetweenEvictionRunsMillis毫秒秒檢查一次連線池中空閒的連線,把空閒時間超過minEvictableIdleTimeMillis毫秒的連線斷開,直到連線池中的連線數到minIdle為止
14、testOnBorrow
顧明思義,就是在進行borrowObject進行處理時,對拿到的connection進行validateObject校驗
15、testOnReturn
顧明思義,就是在進行returnObject對返回的connection進行validateObject校驗,個人覺得對資料庫連線池的管理意義不大
16、testWhileIdle
關注的重點,GenericObjectPool中針對pool管理,起了一個Evict的TimerTask定時執行緒進行控制(可通過設定引數timeBetweenEvictionRunsMillis>0),定時對執行緒池中的連結進行validateObject校驗,對無效的連結進行關閉後,會呼叫ensureMinIdle,適當建立連結保證最小的minIdle連線數
17、validateQuery
代表檢查的sql,用來檢查連線是否有效的sql,要求是一個查詢語句,如果validateQuery為null,則testOnBorrow、testOnReturn、testWhileIdle 都不會起作用
18、validateQueryTimeout
代表在執行檢查時,通過statement設定,statement.setQueryTimeout(validationQueryTimeout)
19、numTestsPerEvictionRun
代表每次檢查連結的數量,建議設定和maxActive一樣大,這樣每次可以有效檢查所有的連結.
Java程式碼
- 1."testWhileIdle">true
- 2."testOnBorrow">false
- 3."testOnReturn">false
- 4."validationQuery">select sysdate from dual
- 5."validationQueryTimeout">1
- 6."timeBetweenEvictionRunsMillis">30000
- 7."numTestsPerEvictionRun">20
minEvictableIdleTimeMillis,removeAbandonedTimeout這兩個引數針對的連線物件不一樣
minEvictableIdleTimeMillis針對連線池中的連線物件
removeAbandonedTimeout針對未被close的活動連線.
20、JdbcInterceptors
設定 tomcat jdbc 連線池的攔截器
內建的攔截器:
org.apache.tomcat.jdbc.pool.interceptor.ConnectionState
追蹤自動提交、只讀狀態、catalog和事務隔離等級等狀態
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer
追蹤開啟的statement,當連線被歸還時關閉它們.
多個攔截器用;分割,例如:
javapoolProps.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");