java - 如何在多线程环境中生成PreparedStatement?

标签 java multithreading jdbc prepared-statement

我有一个多线程代码的工作版本,但是我对我的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/

相关文章:

java - 使用多线程将控制台输出到文件

具有多线程响应处理程序的 Python http 服务器

java - 使用 Java/JDBC 实现的 MySQL DB - 基本设计查询

java - JDK中是否包含jdbc api?

java - 在spark java api(org.apache.spark.SparkException)中使用filter(),map(),...时出错

java - Wicket 中多文件上传的 FileNotFoundException

multithreading - Delphi并行编程-多线程速度慢

java - 在linux机器上从java执行mysql数据库导入脚本

java - Gradle Spring Boot Devtools : developmentOnly and runtimeClasspath

java - 多级泛型