最近使用這類連接池發(fā)現(xiàn)有問題,當(dāng)鏈接一個(gè)數(shù)據(jù)庫(kù)如果數(shù)據(jù)庫(kù)端異常或重啟,就會(huì)出現(xiàn)提示鏈接數(shù)據(jù)庫(kù)異常的信息。

所說(shuō)報(bào)這樣的錯(cuò)誤,但是不影響程序的正常運(yùn)行,所以一開始,忽略了Communications link failure,一直在the error occurred while setting parameters中找原因,以為是mapper.xml中jdbcType參數(shù)類型的問題,其實(shí)不是,犯了一個(gè)方向性錯(cuò)誤
這個(gè)問題出現(xiàn)的情況,是在程序重啟,第一次訪問的時(shí)候出現(xiàn)的,接下來(lái)的訪問就沒有這個(gè)問題,其實(shí),這就是數(shù)據(jù)庫(kù)連接池的問題了
下面粘貼下我配置的datasource:
<bean id="uas.dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <PRoperty name="driverClassName" value="${jdbc.dataSource.driverClassName}"></property> <property name="initialSize" value="${jdbc.dataSource.initialSize}"></property> <property name="maxActive" value="${jdbc.dataSource.maxActive}"></property> <property name="maxIdle" value="${jdbc.dataSource.maxIdle}"></property> <property name="maxWait" value="${jdbc.dataSource.maxWait}"></property> <property name="minIdle" value="${jdbc.dataSource.minIdle}"></property> <property name="timeBetweenEvictionRunsMillis" value="${jdbc.dataSource.timeBetweenEvictionRunsMillis}"></property> <property name="minEvictableIdleTimeMillis" value="${jdbc.dataSource.minEvictableIdleTimeMillis}"></property> <property name="url" value="${jdbc.uasdb.url}"></property> <property name="username" value="${jdbc.uasdb.username}"></property> <property name="passWord" value="${jdbc.uasdb.password}"></property> </bean>可以看出,我在配置中并沒有配置validationQuery的屬性,此屬性的作用是:用來(lái)檢測(cè)連接是否有效的sql,要求是一個(gè)查詢語(yǔ)句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會(huì)其作用。由于沒有配置validationQuery,在重啟之后,初次訪問數(shù)據(jù)庫(kù)時(shí),連接池沒有該連接,就會(huì)報(bào)上述錯(cuò)誤,隨后連接池重新創(chuàng)建連接,在接下來(lái)的訪問中,便不再報(bào)錯(cuò)。
既然這里遇到了 BasicDataSource連接池,那么下面也總結(jié)下 BasicDataSource連接池的屬性配置以及每個(gè)屬性的作用
!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置獲取連接等待超時(shí)的時(shí)間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT * from table" />//檢測(cè)時(shí)候用到的語(yǔ)句,隨便寫一條即可 <!--是否要進(jìn)行檢測(cè)--> <property name="testWhileIdle" value="true" /> <!--是否在數(shù)據(jù)庫(kù)連接請(qǐng)求量大的時(shí)候,如總數(shù)50,當(dāng)前已請(qǐng)求了49個(gè),所剩不多了,檢測(cè)那些執(zhí)行時(shí)間久的連接--> <property name="removeAbandoned" value="true"/> <!--每次檢測(cè)時(shí),需要檢測(cè)多少個(gè)數(shù)據(jù)連接,一般設(shè)置為與最大連接數(shù)一樣,這樣就可以檢測(cè)完所有的連接--> <property name="numTestsPerEvictionRun" value="20"/> <!--申請(qǐng)連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降低性能,保險(xiǎn)起見還是檢測(cè)吧--> <property name="testOnBorrow" value="true" /> <!--歸還連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效--> <property name="testOnReturn" value="true" /> 屬性功能:
配置 | 缺省值 | 說(shuō)明 |
name |
| 配置這個(gè)屬性的意義在于,如果存在多個(gè)數(shù)據(jù)源,監(jiān)控的時(shí)候可以通過(guò)名字來(lái)區(qū)分開來(lái)。如果沒有配置,將會(huì)生成一個(gè)名字,格式是:"DataSource-" + System.identityHashCode(this) |
jdbcUrl |
| 連接數(shù)據(jù)庫(kù)的url,不同數(shù)據(jù)庫(kù)不一樣。例如:MySQL : jdbc:mysql://10.20.153.104:3306/druid2 Oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto |
username |
| 連接數(shù)據(jù)庫(kù)的用戶名 |
password |
| 連接數(shù)據(jù)庫(kù)的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細(xì)看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter |
driverClassName | 根據(jù)url自動(dòng)識(shí)別 | 這一項(xiàng)可配可不配,如果不配置druid會(huì)根據(jù)url自動(dòng)識(shí)別dbType,然后選擇相應(yīng)的driverClassName |
initialSize | 0 | 初始化時(shí)建立物理連接的個(gè)數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時(shí) |
maxActive | 8 | 最大連接池?cái)?shù)量 |
maxIdle | 8 | 已經(jīng)不再使用,配置了也沒效果 |
minIdle |
| 最小連接池?cái)?shù)量 |
maxWait |
| 獲取連接時(shí)最大等待時(shí)間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會(huì)有所下降,如果需要可以通過(guò)配置useUnfairLock屬性為true使用非公平鎖。 |
poolPreparedStatements | false | 是否緩存preparedStatement,也就是PSCache。PSCache對(duì)支持游標(biāo)的數(shù)據(jù)庫(kù)性能提升巨大,比如說(shuō)oracle。在mysql5.5以下的版本中沒有PSCache功能,建議關(guān)閉掉。5.5及以上版本有PSCache,建議開啟。 |
maxOpenPreparedStatements | -1 | 要啟用PSCache,必須配置大于0,當(dāng)大于0時(shí),poolPreparedStatements自動(dòng)觸發(fā)修改為true。在Druid中,不會(huì)存在Oracle下PSCache占用內(nèi)存過(guò)多的問題,可以把這個(gè)數(shù)值配置大一些,比如說(shuō)100 |
validationQuery |
| 用來(lái)檢測(cè)連接是否有效的sql,要求是一個(gè)查詢語(yǔ)句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會(huì)其作用。 |
testOnBorrow | true | 申請(qǐng)連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降低性能。 |
testOnReturn | false | 歸還連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降低性能 |
testWhileIdle | false | 建議配置為true,不影響性能,并且保證安全性。申請(qǐng)連接的時(shí)候檢測(cè),如果空閑時(shí)間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測(cè)連接是否有效。 |
timeBetweenEvictionRunsMillis |
| 有兩個(gè)含義:1) Destroy線程會(huì)檢測(cè)連接的間隔時(shí)間2) testWhileIdle的判斷依據(jù),詳細(xì)看testWhileIdle屬性的說(shuō)明 |
numTestsPerEvictionRun |
| 不再使用,一個(gè)DruidDataSource只支持一個(gè)EvictionRun |
minEvictableIdleTimeMillis |
|
|
connectionInitSqls |
| 物理連接初始化的時(shí)候執(zhí)行的sql |
exceptionSorter | 根據(jù)dbType自動(dòng)識(shí)別 | 當(dāng)數(shù)據(jù)庫(kù)拋出一些不可恢復(fù)的異常時(shí),拋棄連接 |
filters |
| 屬性類型是字符串,通過(guò)別名的方式配置擴(kuò)展插件,常用的插件有:監(jiān)控統(tǒng)計(jì)用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall |
proxyFilters |
| 類型是List<com.alibaba.druid.filter.Filter>,如果同時(shí)配置了filters和proxyFilters,是組合關(guān)系,并非替換關(guān)系 |
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注