繁体   English   中英

Hibernate的“ session.flush”上的多线程

[英]Multithreading on Hibernate's 'session.flush'

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

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

在我的示例案例中,我有一个耗时56秒的请求,并且我正在会话中创建200,000个实体。 因此, session.flush()命令花费了这56秒中的32秒,其中只有一个CPU内核为%100。

有没有办法获取需要更新的实体列表并创建SQL语句(例如在四个线程中)?

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

如果您可以处理4个独立的事务,则只需创建一个线程池并将记录分批存储。 池将在多个线程之间分配INSERT操作。

您还确定这真的有帮助吗? 我猜flush()不受CPU限制,但受I / O或网络限制。 但是,您的使用率与100%使用率不同,因此我可能是错的。 也可以尝试使用无状态会话,原始JDBC /本机查询,批处理插入等来优化INSERT 。拆分成单独的线程要困难得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM