資源復(fù)用是系統(tǒng)性能優(yōu)化中的一種常用手段,如單例,數(shù)據(jù)庫(kù)連接池,線程池等都是資源復(fù)用的常用技巧。 數(shù)據(jù)庫(kù)連接池的基本原理是在內(nèi)部對(duì)象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫(kù)連接,并對(duì)外暴露數(shù)據(jù)庫(kù)連接獲取和返回方法
和dbcp類似,druid的配置項(xiàng)如下
DruidDataSource配置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_user}" />
<property name="password" value="${jdbc_password}" />
<property name="filters" value="stat" />
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="minIdle" value="1" />
<property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="20" />
<property name="removeAbandoned" value="true" /> <!-- 打開removeAbandoned功能 -->
<property name="removeAbandonedTimeout" value="1800" /> <!-- 1800秒,也就是30分鐘 -->
<property name="logAbandoned" value="true" /> <!-- 關(guān)閉abanded連接時(shí)輸出錯(cuò)誤日志 -->
</bean>
filters:屬性類型是字符串,通過(guò)別名的方式配置擴(kuò)展插件,常用的插件有:監(jiān)控統(tǒng)計(jì)
用的filter:stat日志用的filter:log4j,防御sql注入的filter:wall
initialSize:初始化時(shí)建立物理連接的個(gè)數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一
次getConnection時(shí)
maxActive:最大連接池?cái)?shù)量
minIdle:最小連接池?cái)?shù)量
maxWait:獲取連接時(shí)最大等待時(shí)間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會(huì)有所下降,如果需要可以通過(guò)配置useUnfairLock屬性為true使用非公平鎖
poolPreparedStatements: 是否緩存preparedStatement,也就是PSCache。PSCache對(duì)支持游標(biāo)的數(shù)據(jù)庫(kù)性能提升巨大,比如說(shuō)oracle。在mysql下建議關(guān)閉。
validationQuery:用來(lái)檢測(cè)連接是否有效的sql,要求是一個(gè)查詢語(yǔ)句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會(huì)起作用
validationQueryTimeout:單位秒,檢測(cè)連接是否有效的超時(shí)時(shí)間。底層調(diào)用jdbc Statement對(duì)象的void setQueryTimeout(int seconds)方法
testOnBorrow: 申請(qǐng)連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì) 降低性能。
testOnReturn:歸還連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降 低性能。
testWhileIdle:建議配置為true,不影響性能,并且保證安全性。指明連接是否被空閑連接回收器(如果有)進(jìn)行檢驗(yàn).如果檢測(cè)失敗,則連接將被從池中去除. 。
numTestsPerEvictionRun:不再使用,一個(gè)DruidDataSource只支持一個(gè)EvictionRun
minEvictableIdleTimeMillis:連接保持空閑而不被驅(qū)逐的最長(zhǎng)時(shí)間
connectionInitSqls:物理連接初始化的時(shí)候執(zhí)行的sql
exceptionSorter:當(dāng)數(shù)據(jù)庫(kù)拋出一些不可恢復(fù)的異常時(shí),拋棄連接
removeAbandoned:是否啟用連接泄露檢測(cè)
removeAbandonedTimeout:連接泄露,連接超過(guò)指定時(shí)間未關(guān)閉,就會(huì)被強(qiáng)行回收
logAbandoned:關(guān)閉abanded連接時(shí)輸出錯(cuò)誤日志
內(nèi)容參考:https://github.com/alibaba/druid