我在多线程环境中使用plain-JDBC-Database-Access。
我最近在使用PreparedStatements(Oracle风格)时遇到的一个例外让我意识到它们不线程安全。
当然,总是有可能使用ThreadLocal-Variables(或同步对语句的访问),但有一种更聪明的方式以多线程方式访问数据库吗?
编辑:为了简化问题,我以只读方式访问数据库,因此并不关心并行事务。
答案 0 :(得分:2)
将PreparedStatement
放入ThreadLocal
并不能解决问题 - 即使Connection
必须放入ThreadLocal
。但是,您必须确保即使抛出异常,连接也会正确释放。
那么交易呢?你如何确保一个事务不包含来自独立线程的东西?
最好的方法是采用一些EJB容器模式 - 这里基础设施负责资源和事务管理以及连接池。但是将现有代码改造成EJB甚至Spring 正确并不是一件容易的事。
答案 1 :(得分:0)
只需使用ThreadLocal
这是最简单的方法
您还可以将所有数据库访问委托给单个线程(通过阻塞队列),这也将消除竞争。这也允许更容易批处理许多语句(虽然只适用于更新,查询需要先刷新挂起的更新)