1. 程式人生 > 資料庫 >關於資料庫連線池Druid使用說明

關於資料庫連線池Druid使用說明

根據綜合性能,可靠性,穩定性,擴充套件性,易用性等因素替換成最優的資料庫連線池。

Druid:druid-1.0.29

資料庫Mysql.5.6.17

替換目標:替換掉C3P0,用druid來替換

替換原因:

1、效能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高效能得益於最大限度的避免鎖競爭。

2、druid功能最為全面,sql攔截等功能,統計資料較為全面,具有良好的擴充套件性。

3、綜合性能,擴充套件性等方面,可考慮使用druid或者hikariCP連線池,比較方便對jdbc介面進行監控跟蹤等。

4、可開啟prepareStatement快取,對效能會有大概20%的提升。

psCache是connection私有的,所以不存線上程競爭的問題,開啟pscache不會存在競爭的效能損耗。

psCache的key為prepare執行的sql和catalog等,value對應的為prepareStatement物件。開啟快取主要是減少了解析sql的開銷。

5、3p0歷史悠久,程式碼及其複雜,不利於維護。並且存在deadlock的潛在風險。

6、Druid可以列印SQL,慢查詢方面的日誌

Druid 引數

配置引數 預設值 遊戲服設定的值 引數說明
initialSize 0 4 初始化連線數量
minIdle 0 4 最小空閒連線數
maxActive 8 8 最大併發連線數
maxWait -1L 60000 獲取連線時最大等待時間,單位毫秒。配置了maxWait之後,
預設啟用公平鎖,併發效率會有所下降,
如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
timeBetweenEvictionRunsMillis 60000 60000 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
Destroy執行緒會檢測連線的間隔時間
minEvictableIdleTimeMillis 1800000 1800000 配置一個連線在池中最小生存的時間,單位是毫秒
validationQuery null select 1 用來檢測連線是否有效的sql,要求是一個查詢語句
testOnBorrow FALSE FALSE 申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能。
testOnReturn FALSE FALSE 歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能
testWhileIdle TRUE TRUE 建議配置為true,不影響效能,並且保證安全性。 申請連線的時候檢測,如果
空閒時間大於 timeBetweenEvictionRunsMillis, 執行validationQuery檢測連線是否有效。
poolPreparedStatements FALSE TRUE false 是否快取preparedStatement,也就是PSCache。
PSCache對支援遊標的資料庫效能提升巨大,比如說oracle。
在mysql5.5以下的版本中沒有PSCache功能,建議關閉掉。
5.5及以上版本有PSCache,建議開啟。
maxPoolPreparedStatementPerConnectionSize 10 100 要啟用PSCache,必須配置大於0,當大於0時,
poolPreparedStatements自動觸發修改為true。
單個connnection獨享一個statement cache,也就是說maxOpenPreparedStatements是針對單個connection連結的

執行原理:

資料庫連線池在初始化的時候會建立initialSize個連線,當有資料庫操作時,會從池中取出一個連線。如果當前池中正在使用的連線數等於maxActive,則會等待一段時間,等待其他操作釋放掉某一個連線,如果這個等待時間超過了maxWait,則會報錯;如果當前正在使用的連線數沒有達到maxActive,則判斷當前是否空閒連線,如果有則直接使用空閒連線,如果沒有則新建立一個連線。在連線使用完畢後,不是將其物理連線關閉,而是將其放入池中等待其他操作複用。 同時連線池內部有機制判斷,如果當前的總的連線數少於miniIdle,則會建立新的空閒連線,以保證連線數得到miniIdle。如果當前連線池中某個連線在空閒了timeBetweenEvictionRunsMillis時間後仍然沒有使用,則被物理性的關閉掉。有些資料庫連線的時候有超時限制(mysql連線在8小時後斷開),或者由於網路中斷等原因,連線池的連線會出現失效的情況,這時候設定一個testWhileIdle引數為true,可以保證連線池內部定時檢測連線的可用性,不可用的連線會被拋棄或者重建,最大情況的保證從連線池中得到的Connection物件是可用的。當然,為了保證絕對的可用性,你也可以使用testOnBorrow為true(即在獲取Connection物件時檢測其可用性),不過這樣會影響效能。

如果要進行SQL監控,可以加入以下程式碼:

Log4j2Filter log4j2 = new Log4j2Filter(); 
log4j2.setResultSetLogEnabled(false); 
log4j2.setStatementSqlPrettyFormat(false); 
log4j2.setStatementExecutableSqlLogEnable(true); 
 
log4j2.setDataSourceLogEnabled(false); 
log4j2.setConnectionLogEnabled(false); 
log4j2.setStatementLogEnabled(false); 
log4j2.setResultSetLogEnabled(false); 
ret.setProxyFilters(Arrays.asList(log4j2)); 

閒置檢測,建立連線,廢棄連線清理由這三執行緒管理

Daemon Thread [Abandoned connection cleanup thread] 
Daemon Thread [Druid-ConnectionPool-Create-1184124073] 
Daemon Thread [Druid-ConnectionPool-Destroy-1184124073] 

總結

以上就是本文關於資料庫連線池Druid使用說明的全部內容,希望對大家有所幫助。感興趣的朋友可以參閱:MySQL prepare原理詳解等及其他相關專題,有什麼問題可以隨時留言,小編會及時回覆大家的。