gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:57:18 26 4
gpt4 key购买 nike

我正在使用带有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com