轉自:http://blog.sina.com.cn/s/blog_1549fb0710102whz2.html
spring+ibatis程序測試時報錯:java.sql.SQLException: Io 異常: Connection reset by peer, socket write error;
sql-map-config.xml配置:
<transactionManager type="JDBC" >
<dataSource type="DBCP">
<property value="${drivers}" name="JDBC.Driver" />
<property value="${url}" name="JDBC.ConnectionURL" />
<property value="${user}" name="JDBC.Username" />
<property value="${password}" name="JDBC.Password" />
<property value="${maxActive}" name="Pool.MaximumActiveConnections" />
<property value="${maxIdle}" name="Pool.MaximumIdleConnections" />
<property value="${maxWait}" name="Pool.MaximumWait" />
<property name="validationQuery" value="select * from dual"/>
</dataSource>
</transactionManager>
該問題主要是由於連接時間過長,失效所致,將sql-map-config.xml中的“dataSource”配置修改如下:
<transactionManager type="JDBC" >
<dataSource type="DBCP">
<property value="${drivers}" name="JDBC.Driver" />
<property value="${url}" name="JDBC.ConnectionURL" />
<property value="${user}" name="JDBC.Username" />
<property value="${password}" name="JDBC.Password" />
<property value="${maxActive}" name="Pool.MaximumActiveConnections" />
<property value="${maxIdle}" name="Pool.MaximumIdleConnections" />
<property value="${maxWait}" name="Pool.MaximumWait" />
<property name="validationQuery" value="select * from dual"/>
</dataSource>
</transactionManager>
當數據庫連接池中的連接被創建而長時間不使用的情況下,該連接會自動回收並失效,但客戶端並不知道,在進行數據庫操作時仍然使用的是無效的數據庫連接,這樣,就導致客戶端程序報“ java.sql.SQLException: Io 異常: Connection reset by peer, socket write error; ”或“java.sql.SQLException 關閉的連接”異常,加上
<property name="validationQuery" value="select * from dual"/>
配置后,客戶端在使用一個無效的連接時會先對該連接進行測試,如果發現該連接已經無效,則重新從連接池獲取有效數據庫連接來使用。
注意:網絡不穩定或網絡信號差也會報這種異常。