我們在使用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