如何在多线程环境中访问PreparedStatement?

时间:2011-10-13 08:43:09

标签: java multithreading jdbc prepared-statement

我在多线程环境中使用plain-JDBC-Database-Access。

我最近在使用PreparedStatements(Oracle风格)时遇到的一个例外让我意识到它们线程安全。

当然,总是有可能使用ThreadLocal-Variables(或同步对语句的访问),但有一种更聪明的方式以多线程方式访问数据库吗?

编辑:为了简化问题,我以只读方式访问数据库,因此并不关心并行事务。

2 个答案:

答案 0 :(得分:2)

PreparedStatement放入ThreadLocal并不能解决问题 - 即使Connection必须放入ThreadLocal。但是,您必须确保即使抛出异常,连接也会正确释放。

那么交易呢?你如何确保一个事务不包含来自独立线程的东西?

最好的方法是采用一些EJB容器模式 - 这里基础设施负责资源和事务管理以及连接池。但是将现有代码改造成EJB甚至Spring 正确并不是一件容易的事。

答案 1 :(得分:0)

只需使用ThreadLocal这是最简单的方法

您还可以将所有数据库访问委托给单个线程(通过阻塞队列),这也将消除竞争。这也允许更容易批处理许多语句(虽然只适用于更新,查询需要先刷新挂起的更新)