2012-03-19 54 views
1

我正在为Microsoft SQL Server 2012(sqljdbc_4.0)使用JDBC驱动程序,尽管Connection实例是线程安全的,但Statement实例似乎不是(特别是PreparedStatement)。针对Scala的JDBC PreparedStatement池

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

每个PreparedStatement查询都是相同的,用不同的值代替问号参数(?)。我想知道是否有任何方法可以创建一个PreparedStatement实例池,该实例的大小等于并行集合使用的线程数,然后仅对每个迭代的闭包重复使用一个空闲实例,然后将它们返回到池中重用。

回答

1

虽然连接是thread safe这样做的习惯做法是使用连接池并让每个线程使用单独的连接。

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

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