記錄阿里巴巴連線池DruidDataSource的一個bug

e71hao發表於2018-08-27

問題:應用程式連線資料庫,老是報一個錯誤: caused by wait millis 5000 ,active 0,maxactive 20

連線不上資料庫超時。但是我用一個單獨的jdbc在問題機器上測試連線資料庫,發現卻是可以連線的。


二、解決問題:

        後來經過曲折的探索過程,反覆測試,發現 查詢問題,發現是連線池引數<property name="validationQuery" value="SELECT 1" /> 配置錯誤。雖然配置錯誤,但是連線池版本是1.0.10,太舊(2014年的),沒有把真正的報錯提示出來“ora-00923 未找到要求的關鍵字from”,而是報這個錯誤:“ caused by wait millis 5000 ,active 0,maxactive 20”。也就是說,本來配置出錯,但是因為阿里巴巴連線池DruidDataSource的bug,把這個錯誤隱藏起來,一直沒有報錯。或者說,一直沒有把真正的錯誤報出來。本來是一個很簡單的錯誤。換成1.1.6,錯誤出現了:

一看這個錯誤,就很明白了:因為“”ora-00923 未找到要求的關鍵字from”導致“caused by wait millis 5000 ,active 0,maxactive 20” 連線超時問題。

三。總結:最後建議DruidDataSource配置成如下:

升級到最新穩定版本

<property name="minIdle" value="1" />

<property name="validationQuery" value="SELECT 1 FROM DUAL" />

<property name="testOnBorrow" value="true" />

<property name="poolPreparedStatements" value="true" />

<property name="initialSize" value=1 />

四。另外有幾個引數的意思是:

 validationQuery   SQL查詢,用來驗證從連線池取出的連線,在將連線返回給呼叫者之前.如果指定,
則查詢必須是一個SQL SELECT並且必須返回至少一行記錄
testOnBorrow  true  指明是否在從池中取出連線前進行檢驗,如果檢驗失敗,
則從池中去除連線並嘗試取出另一個.
注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串
testOnReturn  false  指明是否在歸還到池中前進行檢驗
注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串
testWhileIdle  false  指明連線是否被空閒連線回收器(如果有)進行檢驗.如果檢測失敗,
則連線將被從池中去除.
注意: 設定為true後如果要生效,validationQuery引數必須設定為非空字串
timeBetweenEvictionRunsMillis  -1  在空閒連線回收器執行緒執行期間休眠的時間值,以毫秒為單位.
 如果設定為非正數,則不執行空閒連線回收器執行緒
numTestsPerEvictionRun  3  在每次空閒連線回收器執行緒(如果有)執行時檢查的連線數量
minEvictableIdleTimeMillis  1000 * 60 * 30  連線在池中保持空閒而不被空閒連線回收器執行緒
(如果有)回收的最小時間值,單位毫秒

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30393770/viewspace-2212899/,如需轉載,請註明出處,否則將追究法律責任。

相關文章