【发布时间】:2011-10-21 13:11:35
【问题描述】:
我有一个多线程代码的工作版本,但是我对我的 PreparedStatement-wrapper 类是非线程安全的感到不满意。所以我决定在ThreadLocal 中生成 PreparedStatements,以使包装器线程安全。
SQLExceptions 立即开始向我招手。潜在的 Oracle 错误是 ORA-00060 deadlock detected,根据互联网,它应该只发生在写入场景中。我的陈述都是只读的。它出现在一些我既没有听说过也没有有意识地访问过的晦涩的 ACL 包中。
我花了一些时间和精力准备并测试了一个假设,即生成 Connection 对象并从 DataSource 对象中准备来自该对象的语句不应同时发生,因为访问控制数据库可能不是“线程安全的”(尽管 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
【问题讨论】:
标签: java multithreading jdbc prepared-statement