【问题标题】:SQL Server 2012 connection closed issueSQL Server 2012 连接关闭问题
【发布时间】:2016-07-01 09:19:07
【问题描述】:

我收到“com.microsoft.sqlserver.jdbc.SQLServerException:SQL Server 返回不完整的响应。连接已关闭。”在 Java 应用程序中对 Azure SQL 数据库执行连续 SQL 查询时出现异常。在 Azure SQL 数据库上执行的 SQL 查询正在获取大量数据。在获取数据时,我们对每一行进行一些操作,因此执行需要很长时间。我明白了执行SQL查询一定时间后异常(时间段不一致)。SQL服务器版本为12.0.2000.8。

以前有人经历过这种行为吗?

代码片段

 sourceDbConnection = SourceDBConnector().getConnection();
        stmt = createStmt(sourceDbConnection);
        resultSet = stmt.executeQuery(sql query);
        while (resultSet.next()) {
           // .. Do some operation.
        }

SQL 查询

SELECT coalesce(rfr.UniqueID,rs.UniqueID) as PGUID, rs.resultname, rs.ResultId, rs.modifieddatetime FROM tblResult rs
                JOIN tblResultOrg org ON org.CustomerId = rs.CustomerId
                LEFT OUTER JOIN tblResultFormRef rfr ON rfr.UniqueID = rs.UniqueID
                WHERE org.ORGID IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25) AND NOT EXISTS (SELECT NULL FROM tblSynchedResult srs WHERE srs.ResultId=rs.ResultId) AND rs.Status=1             
                ORDER BY rs.modifieddatetime

例外:

com.microsoft.sqlserver.jdbc.SQLServerException: SQL Server returned an incomplete response. The connection has been closed.
   at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1352) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1339) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3740) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.TDSReader.nextPacket(IOBuffer.java:3687) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.TDSReader.ensurePayload(IOBuffer.java:3663) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.TDSReader.readBytes(IOBuffer.java:3979) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.TDSReader.readWrappedBytes(IOBuffer.java:4001) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.TDSReader.readLong(IOBuffer.java:3971) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.PLPInputStream.makeStream(PLPInputStream.java:73) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.PLPInputStream.makeTempStream(PLPInputStream.java:59) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.PLPInputStream.isNull(PLPInputStream.java:45) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValuePrep(dtv.java:2345) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValue(dtv.java:2408) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.DTV.getValue(dtv.java:176) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.Column.getValue(Column.java:113) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:1981) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:1966) ~[sqljdbc4-3.0.0.jar:na]
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getString(SQLServerResultSet.java:2291) ~[sqljdbc4-3.0.0.jar:na]
   at org.apache.commons.dbcp2.DelegatingResultSet.getString(DelegatingResultSet.java:199) ~[commons-dbcp2-2.1.1.jar:2.1.1]
   at org.apache.commons.dbcp2.DelegatingResultSet.getString(DelegatingResultSet.java:199) ~[commons-dbcp2-2.1.1.jar:2.1.1]
   at com.mso.service.etl.job.prepared.EtlPreparedJob.handleFormsHavingNoRecordings(EtlPreparedJob.java:236) ~[classes/:na]
   at com.mso.service.etl.job.prepared.EtlPreparedJob.execute(EtlPreparedJob.java:180) ~[classes/:na]
   at com.mso.service.etl.job.prepared.EtlPreparedJob.run(EtlPreparedJob.java:105) ~[classes/:na]
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_85]
   at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_85]
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_85]
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_85]
   at java.lang.Thread.run(Thread.java:745) [na:1.7.0_85]

【问题讨论】:

    标签: java azure jdbc sql-server-2012 database-connection


    【解决方案1】:

    有一些想法分享给大家。

    1. 根据blog,这似乎不是由没有encrypt=true;的连接字符串引起的,但仍然要确保您的jdbc连接使用安全套接字层(SSL)加密启用。而SO线程SQL Server JDBC Error on Java 8: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption的类似问题是由于缺少SSL加密造成的。

    2. 貌似是Azure SQL数据库资源限制导致的,详情请看https://azure.microsoft.com/en-us/documentation/articles/sql-database-resource-limits/,参考文章建议尝试解决。同时,作为参考,请参阅article关于SQL数据库客户端应用程序的SQL错误代码以解决问题。

    根据你的 sql experssion,根据我的 expersion,我建议你可以尝试为 sql 查询创建物化视图或索引视图以优化 Azure SQL 的性能,请参阅https://msdn.microsoft.com/en-us/library/dn589782.aspxhttps://msdn.microsoft.com/en-us/library/ms187864(v=SQL.100).aspxhttps://msdn.microsoft.com/en-sg/library/ms191432.aspx了解设计模式。

    【讨论】:

    • 彼得:没有任何更新。我们仍在寻找原因。
    猜你喜欢
    • 2016-07-10
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多