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

标签 java spring-mvc transactions

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

最佳答案

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

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

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

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

  1. 隐式:只需设置批量大小属性,hibernate 将完成剩下的工作。
  2. 显式刷新清除
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 个实体,最终内存中将有 2,000 个实体实例,可能会导致 OutOfMemory ...

其他问题...正如您所说,您正在使用 MySQL。 hibernate 批处理选项不适用于 IdGenerator IDENTITY,因此您无法使用 mysql 的 AUTO-INCRMENT 功能进行批量插入。由于 MySQL 中不存在序列生成,因此您只能使用 TABLE 生成器。但表生成器的性能不如身份一。 提一下 Vlad mihalcea(引自他的名著高性能 Java 持久性)

When using MySQL and need lot of inserts It is a good idea to use JOOQ framework for that.

关于java - 如何提高spring mvc批量事务的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61569926/

相关文章:

java - JSF 中 "Remember me"的 Cookie

java - 如何向 MockMvc 添加文件和正文?

java - Spring - 混合注释和基于 validator 的验证

Spring 的安全。登录页面后转发

transactions - ActiveMQ 是否支持多个事务性消费者?

java - 使用 Android 触摸屏捕捉游戏(如《愤怒的小鸟》)的 Action 或击键

java - 如何杀死activemq中的消费者

java - keyListener 有问题

c# - TransactionScope 在某些机器上自动升级到 MSDTC?

java - 按请求的可变事务隔离级别