在Hibernate的'session.flush'上进行多线程处理

时间:2012-04-03 11:54:44

标签: java multithreading hibernate jdbc

首先,这可能是现成的吗?

  

Hibernate 3.6,JDBC batch_size 500,使用Hilo生成器   200.000个实体。

在我的示例中,我有一个需要56秒的请求,并且我在会话中创建了200,000个实体。因此,session.flush()命令占用56秒中的32个,只有一个CPU核心位于%100。

有没有办法获取需要更新的实体列表并创建SQL语句,比如四个线程?

1 个答案:

答案 0 :(得分:1)

您不能简单地在不同的线程中flush(),因为flush()所做的基本上是使用底层连接将所有挂起的SQL INSERT语句发送到数据库。 JDBC连接不是线程安全的,这意味着您必须使用4个不同的连接,因此需要使用4个不同的事务。如果所有插入都需要在一个事务中进行,那么您无需执行任何操作。

如果您可以使用4个单独的事务,只需创建一个线程池并以较小的批量存储记录。 Pool将在多个线程中分发INSERT个操作。

你还确定这会有帮助吗?我猜flush()不受CPU约束,而是I / O或网络绑定。但是你的体验因100%的使用而不同,所以我可能错了。还尝试优化INSERT - 使用无状态会话,原始JDBC /本地查询,批量插入等。分割成单独的线程要困难得多。