我有一个多线程代码的工作版本,但是我对我的PreparedStatement包装类是非线程安全的感到不满意。因此,我决定在 ThreadLocal 中生成PreparedStatements,以使包装器线程安全。
SQLException 立即开始向我招手。底层的 Oracle 错误是检测到 ORA-00060 死锁,根据互联网的说法,它应该只发生在写入场景中。我的陈述都是只读的。它出现在一些不起眼的 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
最佳答案
Can someone confirm or deny that finding?
我还没有听到任何类似的消息,如果它确实存在,它可能纯粹是一个实现细节。您可以发布您的堆栈跟踪(当然是通过剥离个人信息)吗?
此外,您为什么要尝试使 PreparedStatement
线程安全而不是依赖准备好的语句池/缓存?或者更具体地说,什么样的分析促使您实现 ThreadLocal
PreparedStatement
?
关于java - 如何在多线程环境中生成PreparedStatement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7849865/