java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法
程序如果長時(shí)間不進(jìn)行數(shù)據(jù)庫操作,那么數(shù)據(jù)源中的 Connection 很可能已經(jīng)斷開。其原因有可能是防火墻,或者連接的數(shù)據(jù)庫設(shè)置的超時(shí)時(shí)間。
問題總結(jié):
當(dāng)數(shù)據(jù)庫連接池中的連接被創(chuàng)建而長時(shí)間不使用的情況下,該連接會自動回收并失效,但客戶端并不知道,在進(jìn)行數(shù)據(jù)庫操作時(shí)仍然使用的是無效的數(shù)據(jù)庫連接,這樣,就導(dǎo)致客戶端程序報(bào)“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常。
在配置數(shù)據(jù)源后面加上
<property name="validationQuery" value="select * from dual"/>
配置后,客戶端在使用一個(gè)無效的連接時(shí)會先對該連接進(jìn)行測試,如果發(fā)現(xiàn)該連接已經(jīng)無效,則重新從連接池獲取有效數(shù)據(jù)庫連接來使用
程序中采用的是Spring+IBatis,數(shù)據(jù)源配置如下:在 applicationContext.xml中如下設(shè)置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="maxActive" value="100"/> <property name="maxIdle" value="30"/> <property name="maxWait" value="1000"/> <property name="defaultAutoCommit" value="true"/> </bean>
經(jīng)過查找資料和分析,得出該問題主要是由于連接時(shí)間過長,失效所致,將以上配置修改如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="maxActive" value="100"/> <property name="maxIdle" value="30"/> <property name="maxWait" value="1000"/> <property name="defaultAutoCommit" value="true"/> <span style="background-color: rgb(255, 0, 0);"><property name="validationQuery" value="select * from dual"/></span> </bean>
順便提一下數(shù)據(jù)庫DBCP連接池:
在applicationContext.xml中:
<!-- 數(shù)據(jù)源1 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.0.109:3306/test?useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> <!--maxActive: 最大連接數(shù)量--> <property name="maxActive" value="150"/> <!--minIdle: 最小空閑連接--> <property name="minIdle" value="5"/> <!--maxIdle: 最大空閑連接--> <property name="maxIdle" value="20"/> <!--initialSize: 初始化連接--> <property name="initialSize" value="30"/> <!-- 連接被泄露時(shí)是否打印 --> <property name="logAbandoned" value="true"/> <!--removeAbandoned: 是否自動回收超時(shí)連接--> <property name="removeAbandoned" value="true"/> <!--removeAbandonedTimeout: 超時(shí)時(shí)間(以秒數(shù)為單位)--> <property name="removeAbandonedTimeout" value="10"/> <!--maxWait: 超時(shí)等待時(shí)間以毫秒為單位 1000等于60秒--> <property name="maxWait" value="1000"/> <!-- 在空閑連接回收器線程運(yùn)行期間休眠的時(shí)間值,以毫秒為單位. --> <property name="timeBetweenEvictionRunsMillis" value="10000"/> <!-- 在每次空閑連接回收器線程(如果有)運(yùn)行時(shí)檢查的連接數(shù)量 --> <property name="numTestsPerEvictionRun" value="10"/> <!-- 1000 * 60 * 30 連接在池中保持空閑而不被空閑連接回收器線程--> <property name="minEvictableIdleTimeMillis" value="10000"/> <property name="validationQuery" value="SELECT NOW() FROM DUAL"/> </bean>
c3p0解決:
解決的辦法是:
在 applicationContext.xml中如下設(shè)置:
<!-- 數(shù)據(jù)庫連接聲明 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.alibaba.china.jdbc.SimpleDriver" /> <!-- <property name="driverClass" value="oracle.jdbc.OracleDriver" /> --> <property name="jdbcUrl" value="jdbc:oracle:thin:@202.116.70.180:61166:orcl" /> <!-- 每60秒檢查所有連接池中的空閑連接。Default: 0 --> <property name="idleConnectionTestPeriod" value="60" /> <!--如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性。Default: false --> <property name="testConnectionOnCheckin" value="true" /> <!--c3p0將建一張名為Test的空表,并使用其自帶的查詢語句進(jìn)行測試。如果定義了這個(gè)參數(shù)那么 屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將只供c3p0測試使用。Default: null --> <property name="automaticTestTable" value="Test" /> <property name="properties"> <props> <prop key="clientEncoding">GBK</prop> <prop key="serverEncoding">CP1252</prop> <prop key="user">WDS</prop> <prop key="password">HelloOracle</prop> </props> </property> </bean>
配置項(xiàng)一定要作為 <bean> 的子元素,而不能做為 <properties> 的子元素,否則不起作用。
參考:
http://my.oschina.net/tianzimensheng/blog/65225
http://www.cnblogs.com/younes/archive/2012/06/01/2529483.html
http://www.cnblogs.com/safeking/archive/2007/02/01/637067.html
到此這篇關(guān)于java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法的文章就介紹到這了,更多相關(guān)java.sql.SQLException 關(guān)閉的連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中設(shè)計(jì)模式(多例)的實(shí)例詳解
這篇文章主要介紹了java中設(shè)計(jì)模式(多例)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表圖解
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表,文中圖解分析的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05SpringBoot實(shí)戰(zhàn)之實(shí)現(xiàn)結(jié)果的優(yōu)雅響應(yīng)案例詳解
這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)之實(shí)現(xiàn)結(jié)果的優(yōu)雅響應(yīng)案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Java實(shí)現(xiàn)兩個(gè)隨機(jī)數(shù)組合并進(jìn)行排序的方法
本文主要介紹了Java實(shí)現(xiàn)兩個(gè)隨機(jī)數(shù)組合并進(jìn)行排序的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09解決springmvc項(xiàng)目中使用過濾器來解決請求方式為post時(shí)出現(xiàn)亂碼的問題
這篇文章主要介紹了springmvc項(xiàng)目中使用過濾器來解決請求方式為post時(shí)出現(xiàn)亂碼的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08