當您打開結果時是否安全或建議執行獨立語句?如果它們連接到不同的連接或與結果集相同的連接,它們是否重要?我特別關心結果如果存在鎖定,可能導致死鎖。結果集打開時執行語句(JDBC/JAVA)
Ex。
while(resultSet.next()) {
Execute separate statements in here (same or different connection)
}
也是由底層遊標或其他東西支持的結果集?
泰
當您打開結果時是否安全或建議執行獨立語句?如果它們連接到不同的連接或與結果集相同的連接,它們是否重要?我特別關心結果如果存在鎖定,可能導致死鎖。結果集打開時執行語句(JDBC/JAVA)
Ex。
while(resultSet.next()) {
Execute separate statements in here (same or different connection)
}
也是由底層遊標或其他東西支持的結果集?
泰
這裏有幾個問題。
首先,通常是「是」,在遍歷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_ONLY
和TYPE_FORWARD_ONLY
。還建議使用相同的Connection
對象,因爲然後遊標和修改其他對象的SQL都在同一事務中,因此不太可能導致死鎖。
這種死鎖的發生取決於數據庫。此外,需要禁用自動提交以在同一連接上同時使用多個語句。 –
根據我的觀點..
中的ResultSet通常被鏈接到它通常連接到連接的語句安全它。 當生成它的Statement對象 被關閉,重新執行或用於從多個結果序列中檢索下一個 結果時,ResultSet對象會自動關閉。
只要你完成 與
ResultSet
對象的使用變得 雖然Statement
對象隱式地關閉ResultSet
對象時,它 關閉,關閉ResultSet
完成關閉
ResultSet
對象時關閉的ResultSet明確 給機會垃圾回收器 儘快回憶內存 因爲ResultSet
對象可能會佔用 大量內存取決於查詢。
ResultSet.close();
我建議不要使用'ResultSet.close()',任何爲Java 7開發的人都應該使用* try-with-resources *來開發Java應用程序。如果你不使用它,讓代碼正確地清理拋出異常的SQL語句實際上是相當棘手的。 – Jules
這是完全安全的。您有兩個基本選擇:
主要區別在於如何處理交易。
兩個語句不在同一個事務由SQL服務器保證不與對方(通常這意味着服務器將保留任何修改數據的副本,如果舊的交易可能仍然需要它干擾)。它也是服務器如何執行鎖定(如果有的話),但它必須保證不會發生死鎖。通常它是通過一個稱爲序列化的過程來完成的,該過程涉及將事務存儲在日誌中,直到它們可以保證在沒有死鎖的情況下執行。
我以爲你可以有兩個來自同一連接的公開聲明,這是錯誤的? – rubixibuc