迭代大型ResultSet会关闭我的JTDS连接

时间:2015-06-07 06:46:46

标签: java sql-server sql-server-2008 jdbc jtds

我正在编写代码,其目的是从两个不那么小的表中读取所有记录。表A有大约500k记录和25列,表B有少于200k记录和143列。

这些表位于两个独立的SQL Server 2008数据库中,我可以轻松建立与它们的连接。我使用jtds-1.3.1.jar作为我的JDBC驱动程序。问题是我在读取所有记录之前总是遇到异常,异常在

之间变化
  

java.sql.SQLException:I / O错误:套接字已关闭

  

java.sql.SQLException:I / O错误:当没有请求发送时,流2尝试读取

这些例外总是在读取表A中的69k记录或表B中的12.5k记录后发生。

我的连接字符串是:

  

JDBC:JTDS:SQLSERVER://主机:端口;的databaseName = XXX;用户= XXX;密码= XXX; useCursors =真;字符集= ISO-8859-1

我的代码:

Statement st = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
st.setFetchDirection(ResultSet.FETCH_FORWARD);
st.setFetchSize(100);
ResultSet rs = st.executeQuery("SELECT * FROM TABLE A");
int counter = 0;
while (rs.next()) {
    counter++;
    if (counter % 2000 == 0) {
       System.out.println(counter + " records.");
    }
}

第一个例外:

    java.sql.SQLException: I/O Error: socket closed
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2481)
    at net.sourceforge.jtds.jdbc.TdsCore.getNextRow(TdsCore.java:805)
    at net.sourceforge.jtds.jdbc.MSCursorResultSet.processOutput(MSCursorResultSet.java:959)
    at net.sourceforge.jtds.jdbc.MSCursorResultSet.cursorFetch(MSCursorResultSet.java:719)
    at net.sourceforge.jtds.jdbc.MSCursorResultSet.next(MSCursorResultSet.java:1137)
    at com.mycompany.client.MyCopyTest.testSelectFromTable2(MyCopyTest.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.io.DataInputStream.readFully(DataInputStream.java:195)
    at java.io.DataInputStream.readFully(DataInputStream.java:169)
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:850)
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:731)
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477)
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114)
    at net.sourceforge.jtds.jdbc.ResponseStream.readShort(ResponseStream.java:319)
    at net.sourceforge.jtds.jdbc.TdsData.readData(TdsData.java:959)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsRowToken(TdsCore.java:3175)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2433)
    ... 28 more

第二个例外:

java.sql.SQLException: I/O Error: Stream 2 attempting to read when no request has been sent
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2481)
    at net.sourceforge.jtds.jdbc.TdsCore.getNextRow(TdsCore.java:805)
    at net.sourceforge.jtds.jdbc.MSCursorResultSet.processOutput(MSCursorResultSet.java:959)
    at net.sourceforge.jtds.jdbc.MSCursorResultSet.cursorFetch(MSCursorResultSet.java:719)
    at net.sourceforge.jtds.jdbc.MSCursorResultSet.next(MSCursorResultSet.java:1137)
    at com.mycompany.client.MyCopyTest.testSelectFromTable2(MyCopyTest.java:96)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.io.IOException: Stream 2 attempting to read when no request has been sent
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:724)
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477)
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:146)
    at net.sourceforge.jtds.jdbc.ResponseStream.readString(ResponseStream.java:301)
    at net.sourceforge.jtds.jdbc.ResponseStream.readNonUnicodeString(ResponseStream.java:285)
    at net.sourceforge.jtds.jdbc.TdsData.readData(TdsData.java:961)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsRowToken(TdsCore.java:3175)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2433)
    ... 28 more

我搜索了很多,但只发现了有关身份验证问题或驱动程序无法解析的无效数据的问题,我相信情况并非如此。我有什么明显的遗失吗?

任何输入都将受到高度赞赏。

0 个答案:

没有答案