2017-11-17 90 views
0

我们在使用Java编写语句时遇到问题。唯一的例外似乎是很清楚的:SQL异常只发生在三台服务器中的一台上

Root Exception stack trace: com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getGeneratedKeys(SQLServerStatement.java:1973) at org.apache.commons.dbcp.DelegatingStatement.getGeneratedKeys(DelegatingStatement.java:315)

它基本上说,我们正在努力已被执行之前读取查询结果。听起来似乎合理。现在,这是造成这个异常的代码如下:

... 

    preparedStatement.executeUpdate(); 

    ResultSet resultSet = preparedStatement.getGeneratedKeys(); 
    if(resultSet.next()) { 
     retval = resultSet.getLong(1); 
    } 

    ... 

正如你可以看到,我们获取查询结果后,我们执行的语句。

在这种情况下,我们尝试从查询的ResultSet中获取生成的密钥,我们只是成功执行了该查询。

问题

我们运行在三个不同的服务器代码(负载均衡,搬运工集装箱)。奇怪的是,这个例外只有发生在第三个码头服务器上。其他两个码头服务器有从来没有遇到此异常。

额外:失败的查询每天执行约13000次。 (4500由服务器3处理)大多数情况下,查询在服务器3也能正常工作。有时候,可以说每天20次,查询失败。总是相同的查询,始终是同一台服务器。从来没有其他的服务器。

我们已经试过

  • 我们检查了软件版本。但是,这一切都是一样的,因为所有的服务器都在运行相同的docker镜像。
  • 我们已更新到Java的最新Microsoft SQL驱动程序
  • 我们检查了我们是否使用PreparedStatement.RETURN_GENERATED_KEYS参数构建了我们所有的PreparedStatements

看起来它是一些服务器配置相关的问题,因为码头图像都是一样的。但我们找不到原因。有没有人有什么问题可以建议?还是有人曾经遇到过这个问题?

回答

0

据我所知,SQL Server不支持批处理执行情况下的getGeneratedKeys()。

这里是功能要求是尚未满足:https://github.com/Microsoft/mssql-jdbc/issues/245

我的建议是,如果你由于某种原因,第三个服务器批量插入被contitiously执行,这可能会导致你所提到的例外(如果在另外两个只有一个项目被插入)

你可以尝试登录sql语句来检查这个

+0

感谢您的回答。我会尝试一下你的建议,但并不能解释为什么相同的代码在一台服务器上失败,而不是在其他服务器上失败。 – Harrie

相关问题