我们在使用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
。
看起来它是一些服务器配置相关的问题,因为码头图像都是一样的。但我们找不到原因。有没有人有什么问题可以建议?还是有人曾经遇到过这个问题?
感谢您的回答。我会尝试一下你的建议,但并不能解释为什么相同的代码在一台服务器上失败,而不是在其他服务器上失败。 – Harrie