Tomcat-Jdbc-Pool配置及性能調優

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代碼  收藏代碼

    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");

---------------------
作者:GeekZFZ
來源:CSDN
原文:https://blog.csdn.net/fengzhou0920/article/details/70156011
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章