2013-12-17 52 views
0

當您打開結果時是否安全或建議執行獨立語句?如果它們連接到不同的連接或與結果集相同的連接,它們是否重要?我特別關心結果如果存在鎖定,可能導致死鎖。結果集打開時執行語句(JDBC/JAVA)

Ex。

while(resultSet.next()) { 
    Execute separate statements in here (same or different connection) 
} 

也是由底層遊標或其他東西支持的結果集?

+0

我以爲你可以有兩個來自同一連接的公開聲明,這是錯誤的? – rubixibuc

回答

3

這裏有幾個問題。

首先,通常是「是」,在遍歷ResultSet時運行其他SQL語句是可能和常見的。是的,ResultSets由遊標支持。

這樣做也可能造成死鎖,所以你只需要知道這一點。如果在循環內部執行的SQL未修改與ResultSet相同的表中的行,則應確保使用併發模式CONCUR_READ_ONLY創建ResultSet,並且通常嘗試使用TYPE_FORWARD_ONLY

例如:

Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
            ResultSet.CONCUR_READ_ONLY); 

如果您在塊寫操作不應該產生一般鎖使用CONCUR_READ_ONLYTYPE_FORWARD_ONLY。還建議使用相同的Connection對象,因爲然後遊標和修改其他對象的SQL都在同一事務中,因此不太可能導致死鎖。

+0

這種死鎖的發生取決於數據庫。此外,需要禁用自動提交以在同一連接上同時使用多個語句。 –

0

根據我的觀點..

中的ResultSet通常被鏈接到它通常連接到連接的語句安全它。 當生成它的Statement對象 被關閉,重新執行或用於從多個結果序列中檢索下一個 結果時,ResultSet對象會自動關閉。

只要你完成 與ResultSet對象的使用變得 雖然Statement對象隱式地關閉 ResultSet對象時,它 關閉,關閉ResultSet完成

關閉ResultSet對象時關閉的ResultSet明確 給機會垃圾回收器 儘快回憶內存 因爲ResultSet對象可能會佔用 大量內存取決於查詢。

ResultSet.close();

+1

我建議不要使用'ResultSet.close()',任何爲Java 7開發的人都應該使用* try-with-resources *來開發Java應用程序。如果你不使用它,讓代碼正確地清理拋出異常的SQL語句實際上是相當棘手的。 – Jules

0

這是完全安全的。您有兩個基本選擇:

  • 使用不同的連接對象。
  • 使用相同的連接對象。

主要區別在於如何處理交易。

  • 不同連接總是在不同的交易
  • 在同一個連接不同的語句可以做成在同一個事務,如果你設置自動提交模式下爲false。

兩個語句不在同一個事務由SQL服務器保證不與對方(通常這意味着服務器將保留任何修改數據的副本,如果舊的交易可能仍然需要它干擾)。它也是服務器如何執行鎖定(如果有的話),但它必須保證不會發生死鎖。通常它是通過一個稱爲序列化的過程來完成的,該過程涉及將事務存儲在日誌中,直到它們可以保證在沒有死鎖的情況下執行。