JTDS - java.sql.SQLException: I/O Error: Connection reset by peer: socket write error
JTDS - java.sql.SQLException: I/O Error: Connection reset by peer: socket write error
我正在使用 jTDS
是用于 Microsoft SQL Server (2012)
的开源 100% 纯 Java (type 4) JDBC 3.0
驱动程序。
Tomcat 7
- 我有下面的连接池配置
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/webapp">
<Resource name="jdbc/dbname" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" removeAbandoned="true" removeAbandonedTimeout="60"
username="abc" password="abc" driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sqlserver://localhost;databaseName=dbname;SelectMethod=Cursor"/>
</Context>
有时,我会遇到以下异常 - 无法从 sql 服务器获得连接。不知道是什么原因?
java.sql.SQLException: I/O Error: Connection reset by peer: socket
write error at
net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052) at
net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465)
at
net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:777)
at
org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662) Caused by:
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method) at
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at
java.io.DataOutputStream.write(DataOutputStream.java:90) at
net.sourceforge.jtds.jdbc.SharedSocket.sendNetPacket(SharedSocket.java:671)
at
net.sourceforge.jtds.jdbc.RequestStream.putPacket(RequestStream.java:560)
at
net.sourceforge.jtds.jdbc.RequestStream.flush(RequestStream.java:508)
at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1039)
... 8 more 17-Apr-2015 12:00:54 ERROR PatientProcessor:614 -
SQLException java.sql.SQLException: Already closed. at
org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:84)
at
org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181)
at at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662
大概检查以下条件:
- 检查SQL语句执行前socket或资源池端口是否未关闭
- 检查连接是否未被任何其他进程重置
- 检查端口是否未被其他进程或其他执行使用或锁定。
- 检查连接池中是否有可用端口。
我终于找到了这个错误的原因。
这是因为,在重新启动数据库服务器后,tomcat 服务器没有重新启动(因此即使在重新启动数据库时它仍然存在)。因此池中的连接变得无效。因此,当网页第一次尝试创建数据库连接时会提示此错误,并且在下一次尝试时它将从连接池中获取有效连接,因为应用程序服务器识别其连接无效,因此它会获取新连接池。
我正在使用 jTDS
是用于 Microsoft SQL Server (2012)
的开源 100% 纯 Java (type 4) JDBC 3.0
驱动程序。
Tomcat 7
- 我有下面的连接池配置
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/webapp">
<Resource name="jdbc/dbname" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" removeAbandoned="true" removeAbandonedTimeout="60"
username="abc" password="abc" driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sqlserver://localhost;databaseName=dbname;SelectMethod=Cursor"/>
</Context>
有时,我会遇到以下异常 - 无法从 sql 服务器获得连接。不知道是什么原因?
java.sql.SQLException: I/O Error: Connection reset by peer: socket write error at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052) at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465) at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:777) at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93) at at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:662) Caused by: java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at java.io.DataOutputStream.write(DataOutputStream.java:90) at net.sourceforge.jtds.jdbc.SharedSocket.sendNetPacket(SharedSocket.java:671) at net.sourceforge.jtds.jdbc.RequestStream.putPacket(RequestStream.java:560) at net.sourceforge.jtds.jdbc.RequestStream.flush(RequestStream.java:508) at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1039) ... 8 more 17-Apr-2015 12:00:54 ERROR PatientProcessor:614 - SQLException java.sql.SQLException: Already closed. at org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:84) at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181) at at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:662
大概检查以下条件:
- 检查SQL语句执行前socket或资源池端口是否未关闭
- 检查连接是否未被任何其他进程重置
- 检查端口是否未被其他进程或其他执行使用或锁定。
- 检查连接池中是否有可用端口。
我终于找到了这个错误的原因。 这是因为,在重新启动数据库服务器后,tomcat 服务器没有重新启动(因此即使在重新启动数据库时它仍然存在)。因此池中的连接变得无效。因此,当网页第一次尝试创建数据库连接时会提示此错误,并且在下一次尝试时它将从连接池中获取有效连接,因为应用程序服务器识别其连接无效,因此它会获取新连接池。