2017-11-17 180 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

相關問題