解决 c3p0 和 MySQL 集成情况下,连接长时间闲置后重新使用时报错的问题
MySQL 的默認設(shè)置下,當(dāng)一個連接的空閑時間超過8小時后,MySQL 就會斷開該連接,而 c3p0 連接池則以為該被斷開的連接依然有效。在這種情況下,如果客戶端代碼向 c3p0 連接池請求連接的話,連接池就會把已經(jīng)失效的連接返回給客戶端,客戶端在使用該失效連接的時候即拋出異常。
解決這個問題的辦法有三種:
1. 增加 MySQL 的 wait_timeout 屬性的值。
修改?/etc/mysql/my.cnf?文件,在 [mysqld] 節(jié)中設(shè)置:
wait_timeout?=?86400
2. 減少連接池內(nèi)連接的生存周期,使之小于上一項中所設(shè)置的 wait_timeout 的值。
修改 c3p0 的配置文件,設(shè)置:
#?Note:?MySQL?times?out?idle?connections?after?8?hours(28,800?seconds)
#?so?ensure?this?value?is?below?MySQL?idle?timeout
cpool.maxIdleTime=25200
在 Spring 的配置文件中:
<bean?id="dataSource"????class="com.mchange.v2.c3p0.ComboPooledDataSource">
????<property?name="maxIdleTime"?value="${cpool.maxIdleTime}"?/>
????<!--?other?properties?-->
</bean>
3. 定期使用連接池內(nèi)的連接,使得它們不會因為閑置超時而被 MySQL 斷開。
修改 c3p0 的配置文件,設(shè)置:
修改 Spring 的配置文件:
<bean?id="dataSource" ????class="com.mchange.v2.c3p0.ComboPooledDataSource"> ????<property?name="preferredTestQuery" ????????value="${cpool.preferredTestQuery}"?/> ????<property?name="idleConnectionTestPeriod" ????????value="${cpool.idleConnectionTestPeriod}"?/> ????<property?name="testConnectionOnCheckout" ????????value="${cpool.testConnectionOnCheckout}"?/> ????<!--?other?properties?--> </bean>
附:以下 awk 腳本可以用以將 c3p0.properties 文件中的屬性設(shè)置轉(zhuǎn)換成為 applicationContext.xml 中 數(shù)據(jù)庫連接池 DataSource 所需的 XML 元素形式。
BEGIN?{
????FS="=";
}
{
????if?(NF?==?2)?{
????????if?((x=index($1,?"."))?>?0)?{
????????????property_name?=?substr($1,?x+1,?length($1));
????????}?else?{
????????????property_name?=?$1;
????????}
????????printf("<property?name="%s"?value="${%s}"/>?",?property_name,?$1);
????}
}
轉(zhuǎn)載于:https://www.cnblogs.com/lydong/p/5001395.html
總結(jié)
以上是生活随笔為你收集整理的解决 c3p0 和 MySQL 集成情况下,连接长时间闲置后重新使用时报错的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC 继承
- 下一篇: Java Map用法