首先,这可能是现成的吗?
Hibernate 3.6,JDBC batch_size 500,使用Hilo生成器 200.000个实体。
在我的示例中,我有一个需要56秒的请求,并且我在会话中创建了200,000个实体。因此,session.flush()
命令占用56秒中的32个,只有一个CPU核心位于%100。
有没有办法获取需要更新的实体列表并创建SQL语句,比如四个线程?
答案 0 :(得分:1)
您不能简单地在不同的线程中flush()
,因为flush()
所做的基本上是使用底层连接将所有挂起的SQL INSERT
语句发送到数据库。 JDBC连接不是线程安全的,这意味着您必须使用4个不同的连接,因此需要使用4个不同的事务。如果所有插入都需要在一个事务中进行,那么您无需执行任何操作。
如果您可以使用4个单独的事务,只需创建一个线程池并以较小的批量存储记录。 Pool将在多个线程中分发INSERT
个操作。
你还确定这会有帮助吗?我猜flush()
不受CPU约束,而是I / O或网络绑定。但是你的体验因100%的使用而不同,所以我可能错了。还尝试优化INSERT
- 使用无状态会话,原始JDBC /本地查询,批量插入等。分割成单独的线程要困难得多。