java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法
程序如果長時間不進行數(shù)據(jù)庫操作,那么數(shù)據(jù)源中的 Connection 很可能已經(jīng)斷開。其原因有可能是防火墻,或者連接的數(shù)據(jù)庫設(shè)置的超時時間。
問題總結(jié):
當數(shù)據(jù)庫連接池中的連接被創(chuàng)建而長時間不使用的情況下,該連接會自動回收并失效,但客戶端并不知道,在進行數(shù)據(jù)庫操作時仍然使用的是無效的數(shù)據(jù)庫連接,這樣,就導致客戶端程序報“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常。
在配置數(shù)據(jù)源后面加上
<property name="validationQuery" value="select * from dual"/>
配置后,客戶端在使用一個無效的連接時會先對該連接進行測試,如果發(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)過查找資料和分析,得出該問題主要是由于連接時間過長,失效所致,將以上配置修改如下:
<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"/> <!-- 連接被泄露時是否打印 --> <property name="logAbandoned" value="true"/> <!--removeAbandoned: 是否自動回收超時連接--> <property name="removeAbandoned" value="true"/> <!--removeAbandonedTimeout: 超時時間(以秒數(shù)為單位)--> <property name="removeAbandonedTimeout" value="10"/> <!--maxWait: 超時等待時間以毫秒為單位 1000等于60秒--> <property name="maxWait" value="1000"/> <!-- 在空閑連接回收器線程運行期間休眠的時間值,以毫秒為單位. --> <property name="timeBetweenEvictionRunsMillis" value="10000"/> <!-- 在每次空閑連接回收器線程(如果有)運行時檢查的連接數(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那么在取得連接的同時將校驗連接的有效性。Default: false --> <property name="testConnectionOnCheckin" value="true" /> <!--c3p0將建一張名為Test的空表,并使用其自帶的查詢語句進行測試。如果定義了這個參數(shù)那么 屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供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>
配置項一定要作為 <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ù)結(jié)構(gòu)之雙向鏈表圖解
這篇文章主要為大家詳細介紹了Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表,文中圖解分析的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05SpringBoot實戰(zhàn)之實現(xiàn)結(jié)果的優(yōu)雅響應(yīng)案例詳解
這篇文章主要介紹了SpringBoot實戰(zhàn)之實現(xiàn)結(jié)果的優(yōu)雅響應(yīng)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法
本文主要介紹了Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09解決springmvc項目中使用過濾器來解決請求方式為post時出現(xiàn)亂碼的問題
這篇文章主要介紹了springmvc項目中使用過濾器來解決請求方式為post時出現(xiàn)亂碼的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08