JTDS - java.sql.SQLException:I / O错误:通过对等方重置连接:套接字写入错误

时间:2015-05-13 05:39:53

标签: java sql-server sql-server-2012 jtds

我使用jTDSJava (type 4) JDBC 3.0的开源100%纯Microsoft SQL Server (2012)驱动程序。

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 server获取连接。我不知道原因是什么?

  

java.sql.SQLException:I / O错误:通过peer:socket重置连接   写错误   net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052)at at   net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465)     在   net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:777)     在   org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)     at at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.runTask(ThreadPoolExecutor.java:895)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:918)     在java.lang.Thread.run(Thread.java:662)引起:   java.net.SocketException:由peer重置连接:套接字写入错误     在java.net.SocketOutputStream.socketWrite0(Native Method)at   java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)     在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)     在   net.sourceforge.jtds.jdbc.RequestStream.putPacket(RequestStream.java:560)     在   net.sourceforge.jtds.jdbc.RequestStream.flush(RequestStream.java:508)     at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1039)     ... 8更多17-Apr-2015 12:00:54 ERROR PatientProcessor:614 -   SQLException java.sql.SQLException:已经关闭。在   org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:84)     在   org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper.close(PoolingDataSource.java:181)     at at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.runTask(ThreadPoolExecutor.java:895)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:918)     在java.lang.Thread.run(Thread.java:662

2 个答案:

答案 0 :(得分:3)

可能检查以下条件:

  1. 在执行SQL语句之前,检查套接字或资源池端口是否未关闭。
  2. 检查连接是否未被任何其他进程重置
  3. 检查端口是否未被其他进程或其他执行使用或锁定。
  4. 检查连接池中是否有可用的端口。

答案 1 :(得分:0)

最后,我能找到导致此错误的原因。 这是因为,重新启动数据库服务器后,tomcat服务器未重新启动(因此即使在重新启动数据库时它仍然存在)。因此,池中的连接无效。因此,当网页第一次尝试创建数据库连接时,此错误会提示,并且在下次尝试期间,当应用程序服务器识别其连接无效时,它将从连接池获得有效连接,因此它将获得新连接池。