1. 程式人生 > >druid 教程 connection holder is null

druid 教程 connection holder is null

、proxool等,druid作為一名後起之秀,憑藉其出色的效能,也逐漸印入了大家的眼簾。接下來本教程就說一下druid的簡單使用。

首先從http://repo1.maven.org/maven2/com/alibaba/druid/ 下載最新的jar包。如果想使用最新的原始碼編譯,可以從https://github.com/alibaba/druid 下載原始碼,然後使用maven命令列,或者匯入到eclipse中進行編譯。

1 配置

和dbcp類似,druid的常用配置項如下
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

表1.1 配置屬性

表1.1僅僅列出了常用配置屬性,完整的屬性列表可以參考程式碼類DruidDataSourceFactory 的ALL_PROPERTIES屬性,根據常用的配置屬性,首先給出一個如下的配置檔案,放置於src目錄下。

[plain] view plain copy

url:jdbc:mysql://localhost:3306/dragoon_v25_masterdb  
driverClassName:com.mysql.jdbc.Driver  
username:root  
password:aaaaaaaa  

filters:stat  

maxActive:20  
initialSize:1  
maxWait:60000  
minIdle:10  
#maxIdle:15  

timeBetweenEvictionRunsMillis:60000  
minEvictableIdleTimeMillis:
300000 validationQuery:SELECT 'x' testWhileIdle:true testOnBorrow:false testOnReturn:false #poolPreparedStatements:true maxOpenPreparedStatements:2

0
配置檔案1.1

配置項中指定了各個引數後,在連線池內部是這麼使用這些引數的。資料庫連線池在初始化的時候會建立initialSize個連線,當有資料庫操作時,會從池中取出一個連線。如果當前池中正在使用的連線數等於maxActive,則會等待一段時間,等待其他操作釋放掉某一個連線,如果這個等待時間超過了maxWait,則會報錯;如果當前正在使用的連線數沒有達到maxActive,則判斷當前是否空閒連線,如果有則直接使用空閒連線,如果沒有則新建立一個連線。在連線使用完畢後,不是將其物理連線關閉,而是將其放入池中等待其他操作複用。

同時連線池內部有機制判斷,如果當前的總的連線數少於miniIdle,則會建立新的空閒連線,以保證連線數得到miniIdle。如果當前連線池中某個連線在空閒了timeBetweenEvictionRunsMillis時間後任然沒有使用,則被物理性的關閉掉。有些資料庫連線的時候有超時限制(mysql連線在8小時後斷開),或者由於網路中斷等原因,連線池的連線會出現失效的情況,這時候可以設定一個testWhileIdle引數為true,注意這裡的“while”這個單詞應該翻譯成“如果”,換句話說testWhileIdle寫為testIfIdle更好理解些,其含義為連線在獲取連線的時候,如果檢測到當前連線不活躍的時間超過了timeBetweenEvictionRunsMillis,則去手動檢測一下當前連線的有效性,在保證確實有效後才加以使用。在檢測活躍性時,如果當前的活躍時間大於minEvictableIdleTimeMillis,則認為需要關閉當前連線。當然,為了保證絕對的可用性,你也可以使用testOnBorrow為true(即在每次獲取Connection物件時都檢測其可用性),不過這樣會影響效能。

最後說一下removeAbandoned引數,其實druid是不能檢測到當前使用的連線是否發生了連線洩露,所以在程式碼內部就假定如果一個連線建立連線的時間很長,則將其認定為洩露,繼而強制將其關閉掉。這個引數在druid中預設是不開啟的,github上給出的wiki中也對其沒有絲毫提及。其實在程式碼中設定testWhileIdle就能在一定程式上消滅掉洩露的連線,因為如果發生了洩露,那麼他的不活躍時間肯定會在某個時間點大於timeBetweenEvictionRunsMillis,繼而被回收掉。

connection holder is null 問題分析

removeAbandoned
對於建立時間超過removeAbandonedTimeout的連線強制關閉
removeAbandonedTimeout
指定連線建立多長時間就需要被強制關閉
logAbandoned
指定發生removeabandoned的時候,是否記錄當前執行緒的堆疊資訊到日誌中
這三個一定要配置在檔案中,當出現問題的時候回列印日誌定位到連線池洩露的地方。

最後定位出來問題
資料庫連線池洩露 DaCsCaseMainQueryDao DaCsCollectionRecDao 兩個dao被action直接呼叫
沒有用service包食物,hibernnate 裡面的這種操作會發生連線池洩露

配合這個一起看看
連線池區別