關於資料庫連線池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原理詳解等及其他相關專題,有什麼問題可以隨時留言,小編會及時回覆大家的。