最近在使用Druid連接池連接MySQL數(shù)據(jù)庫時,發(fā)現(xiàn)連接池中的連接在一段時間內(nèi)沒有使用會自動關(guān)閉,這給我造成了一定的困擾。在經(jīng)過一番研究后,我發(fā)現(xiàn)這是Druid連接池的一個自動回收機(jī)制造成的,接下來我將為大家詳細(xì)介紹它的原理及配置方法。
Druid連接池默認(rèn)開啟了一個連接回收線程,在一定時間內(nèi)沒被使用的連接將被自動回收。這個時間的設(shè)置可以通過配置“timeBetweenEvictionRunsMillis”屬性來指定其回收的間隔時間。其默認(rèn)值為60000毫秒,即一分鐘。但是需要注意的是,這個時間的設(shè)置需要根據(jù)實際情況進(jìn)行調(diào)整,因為時間太長會導(dǎo)致連接常駐連接池?zé)o法被回收,而時間太短則會頻繁的進(jìn)行回收操作,從而導(dǎo)致連接的無效消耗。所以,我們要根據(jù)應(yīng)用程序的實際負(fù)載情況來進(jìn)行設(shè)置,找到一個合適的值。
另外,Druid連接池還對連接的有效性進(jìn)行了檢測,當(dāng)檢測到連接已經(jīng)失效時,該連接也會被自動關(guān)閉。這個檢測的方式通過屬性“testWhileIdle”與“validationQuery”進(jìn)行配置。其中,“testWhileIdle”用來指定啟動連接回收線程后是否開啟連接檢測功能,其默認(rèn)值為true;“validationQuery”用來指定連接檢測的SQL語句。Druid連接池默認(rèn)的檢測語句是“select 'x'”,如果您的數(shù)據(jù)庫支持ping語句,則可以將其修改為“select 1 from dual”,這樣可以更加有效的檢測連接的可用性。在這里我們給出一個配置示例:
# 連接池名稱
spring.datasource.name=datasource_mysql
# 數(shù)據(jù)庫驅(qū)動類
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 數(shù)據(jù)源
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
# 數(shù)據(jù)庫用戶名
spring.datasource.username=root
# 數(shù)據(jù)庫密碼
spring.datasource.password=123456
# 連接池配置
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=50
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=select 1 from dual
最后,建議在實際應(yīng)用中,對Druid連接池的連接回收機(jī)制進(jìn)行一定的優(yōu)化,選擇一個合適的間隔時間以及有效的檢測SQL語句,這樣可以更好的管理連接池,提高應(yīng)用程序的性能。