繁体   English   中英

如何提高 spring mvc 中批量事务的性能

[英]how to improve the performance of bulk transaction in spring mvc

我正在使用 java spring mvc 与 JPA 和 ZCB1F008EEFE65012C4EFZA2C3。 如果我想处理 2000 个事务,我可以使用线程分批处理 500 个事务,考虑到单个事务应该由同一个线程处理吗?还有其他方法吗?

Hibernate 默认不启用批处理。 这意味着它将为每个插入发送单独的 SQL 语句。

要一次性插入如此庞大的数据集,您应该使用批量插入。 这里的 hibernate 属性: hibernate.jdbc.batch_size = 50hibernate.order_inserts = true

第一个属性告诉 Hibernate 以 50 个为一组收集插入(此处仅使用 50 个作为示例......)。 order_inserts 属性告诉 Hibernate 花时间按实体对插入进行分组,从而创建更大的批次。

然后您应该在显式或隐式刷新之间进行选择。

  1. 隐式:只需设置批量大小属性,hibernate 将执行 rest。
  2. 显式flushclear
for (int i = 0; i < 10; i++) {
        if (i > 0 && i % BATCH_SIZE == 0) {
            entityManager.flush();
            entityManager.clear();
        }
        A a = new A();
        entityManager.persist(a);   
}

那么为什么要使用第二个选项呢?

当我们持久化一个实体时,Hibernate 将它存储在持久化上下文中。 例如,如果我们在一个事务中持久化 2,000 个实体,我们最终将在 memory 中拥有 2,000 个实体实例,这可能会导致 OutOfMemory...

其他问题......正如你所说,你正在使用 MySQL。 hibernate 批处理选项不适用于 IdGenerator IDENTITY ,因此您不能将批处理插入与 mysql 的AUTO-INCREMENT功能一起使用。 由于 MySQL 中不存在序列生成,因此您被TABLE生成器困住了。 但是表生成器的性能不如标识一。 提到 Vlad mihalcea(引自他的名著《 High Performance Java Persistence 》)

当使用 MySQL 并且需要大量插入时,使用 JOOQ 框架是一个好主意。

暂无
暂无

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

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