我已經有一個多線程代碼的工作版本,但我不滿意我的PreparedStatement包裝類非線程安全。所以我決定在ThreadLocal
中生成PreparedStatements以使包裝線程安全。如何在多線程環境中生成PreparedStatements?
立即SQLExceptions開始降臨在我身上。底層的Oracle錯誤是ORA-00060 deadlock detected
,根據互聯網應該只發生在寫入場景中。我的陳述全部是隻讀的。它出現在一些我從來沒有聽說過,也沒有有意識地訪問的模糊的ACL包中。
我曾與一些時間和精力準備和測試的假設是,生成Connection
對象,並從該對象從DataSource
對象準備語句不應該在同樣的時間發生,因爲對數據庫的訪問控制可能不是「線程安全」(數據源絕對是數據源)。有人可以確認或否認這一發現?
如果確實如此,是否有一個最佳實踐,以避免在多線程應用程序中同時生成PreparedStatements?
編輯:由於問異常的文本:
Caused by: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "XXX.PKG_ACL", line 129
ORA-06512: at "XXX.PKG_ACL", line 459
ORA-06512: at "XXX.PKG_UTILS", line 1933
ORA-06512: at line 6
我有一套固定的n個db-accessors,所有這些都有他們非常個人的PreparedStatement來訪問數據庫。我理解,理論上來說,數據源應該關注彙集。問題似乎是,同時生成n個PreparedStatements導致數據庫中發生死鎖。我沒有試圖使語句線程安全。 – Jonathan