Scala的JDBC PreparedStatement池

时间:2012-03-19 12:21:43

标签: scala jdbc parallel-processing

我正在使用Microsoft SQL Server 2012的JDBC驱动程序(sqljdbc_4.0),虽然Connection实例是线程安全的,但Statement实例似乎不是({{1} }})。

我在一些集合上使用Scala PreparedStatement方法调用,然后执行.par.foreach个实例。我目前正在PreparedStatement的闭包内创建新的PreparedStatement实例来处理每个项目,因为它们不是线程安全的。

每个.foreach查询都是相同的,用不同的值替换问号参数(PreparedStatement)。我想知道是否有任何方法可以创建一个?实例池,其大小与并行集合使用的线程数相等,然后只为PreparedStatement的每次迭代重用一个空闲的实例关闭,重新使用后将它们返回池中。

1 个答案:

答案 0 :(得分:1)

虽然Connection是thread safe,但执行此操作的惯用方法是使用连接池并让每个线程使用单独的连接。

这将导致连接上的线程与底层传输之间的争用减少。它还将更好地允许另一端的数据库为每个连接使用不同的工作线程。您以客户端内存为代价获得吞吐量,但需要注意的是,如果您同时进行更新,您仍然可以在数据库级别上遇到实际数据争用。

您可以尝试BoneCPc3p0DBCP进行合并,这三种广泛使用。它们允许您配置语句池以节省重新准备它们的成本。