1、分析
看到標題 DBCP 首先想到的肯定是 數據庫連接池哪方面有問題,那么先別着急去解決,不要一股腦就鑽進邏輯代碼中,然后啟用調試就開始一步一步
的分析。我們首先要做的就是想,想想數據庫連接池,在項目中是如何實現的,那么不管你或早或晚,都會想到數據庫連接池相關的配置文件和代碼。那么
問題來了,是否是配置文件配置的有問題(挖掘技術哪家強?)?
那么先來分析下各項連接池配置的屬性:
#回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中。
dataBase.removeAbandoned =false
# 數據庫連接過多長時間不用將被視為被遺棄而收回連接池中。
dataBase.removeAbandonedTimeout = 30
# 將被遺棄的數據庫連接的回收記入日志。
dataBase.logAbandoned = false
#連接池的最大數據庫連接數,設為0 表示無限制。
dataBase.maxActive = 200
#數據庫連接的最大空閑連接數。超過此空閑連接數,,數據庫連接將被標記為不可用,然后被釋放。設為0 表示無限制。
dataBase.maxIdle=40
#最大建立連接等待時間。如果超過此時間將接到異常。設為-1 表示無限制
dataBase.maxWait=10000
#取得、返回對象和空閑時是否進行驗證,檢查對象是否有效,默認都為false即不驗證
dataBase.testOnBorrow=true
dataBase.testWhileIdle=true
dataBase.testOnReturn=true
dataBase.validationQuery=select 1 from dual
說明:
1. #回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中。
dataBase.removeAbandoned =false
如果這個值為true一般是用來調試的時候用的,正式發布后應該改為false,2. # 將被遺棄的數據庫連接的回收記入日志。
dataBase.logAbandoned = false
這個如果設置為true就會引起如下錯誤:
DBCP object created 日期 by the following code was never closed:
java.lang.Exception
3.#連接池的最大數據庫連接數,設為0 表示無限制。
dataBase.maxActive = 200
#數據庫連接的最大空閑時間。超過此空閑時間,數據庫連接將被標記為不可用,然后被釋放。設為0 表示無限制。
dataBase.maxIdle=40
會有可能出現:Cannot get a connection, pool error Timeout waiting for idle object這樣的錯誤
(轉載網上資料)
2、深入
不小心暴露的解決方法,那么 到底是為什么呢?
原因是:dataBase.removeAbandoned = true
設置為true以后,使用這個配置將會使用AbandonedObjectPool,同時上方也提到過,此配置只建議在開發階段使用
因為,AbandonedObjectPool能幫你發現占用連接過長的代碼,比如LOG信息,說明getCustomerOnline占用連接的時間
超過了removeAbandonedTimeout設定的時間,所以設置dataBase.removeAbandoned = false就行了,
AbandonedObjectPool只在開發使用,在后續的版本會去掉,並且現在的API都棄用(不贊成)了,因此在使用此
功能的時候多多注意。