我正在使用Microsoft SQL Server 2012的JDBC驱动程序(sqljdbc_4.0),虽然Connection
实例是线程安全的,但Statement
实例似乎不是({{1} }})。
我在一些集合上使用Scala PreparedStatement
方法调用,然后执行.par.foreach
个实例。我目前正在PreparedStatement
的闭包内创建新的PreparedStatement
实例来处理每个项目,因为它们不是线程安全的。
每个.foreach
查询都是相同的,用不同的值替换问号参数(PreparedStatement
)。我想知道是否有任何方法可以创建一个?
实例池,其大小与并行集合使用的线程数相等,然后只为PreparedStatement
的每次迭代重用一个空闲的实例关闭,重新使用后将它们返回池中。
答案 0 :(得分:1)
虽然Connection是thread safe,但执行此操作的惯用方法是使用连接池并让每个线程使用单独的连接。
这将导致连接上的线程与底层传输之间的争用减少。它还将更好地允许另一端的数据库为每个连接使用不同的工作线程。您以客户端内存为代价获得吞吐量,但需要注意的是,如果您同时进行更新,您仍然可以在数据库级别上遇到实际数据争用。