如何提高 spring mvc 中批量事务的性能
how to improve the performance of bulk transaction in spring mvc
我正在使用 java spring mvc 与 JPA 和休眠。如果我想处理 2000 笔交易,考虑到单个交易应由同一线程处理,是否可以使用线程分批处理 500 笔交易?还有其他方法吗?
Hibernate 默认不启用批处理。这意味着它将为每个插入发送一个单独的 SQL 语句。
要一次插入如此庞大的数据集,您应该使用批量插入。
这里是休眠属性:
hibernate.jdbc.batch_size = 50
和 hibernate.order_inserts = true
第一个 属性 告诉 Hibernate 以 50 个为一组收集插入(这里 50 仅用作示例..)。 order_inserts 属性 告诉 Hibernate 花时间按实体对插入进行分组,从而创建更大的批次。
那么你应该在显式或隐式刷新之间进行选择。
- 隐式:只需设置批处理大小 属性,剩下的由 hibernate 完成。
- 显式
flush
和 clear
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。
休眠批处理选项不适用于 IdGenerator IDENTITY
,因此您不能使用具有 mysql 的 AUTO-INCREMENT
功能的批处理插入。由于 MySQL 中不存在序列生成,因此您只能使用 TABLE
生成器。但是 table 生成器的性能不如身份生成器。
提一下 Vlad mihalcea(引自他的名著High Performance Java Persistence
)
When using MySQL and need lot of inserts It is a good idea to use JOOQ framework for that.
我正在使用 java spring mvc 与 JPA 和休眠。如果我想处理 2000 笔交易,考虑到单个交易应由同一线程处理,是否可以使用线程分批处理 500 笔交易?还有其他方法吗?
Hibernate 默认不启用批处理。这意味着它将为每个插入发送一个单独的 SQL 语句。
要一次插入如此庞大的数据集,您应该使用批量插入。
这里是休眠属性:
hibernate.jdbc.batch_size = 50
和 hibernate.order_inserts = true
第一个 属性 告诉 Hibernate 以 50 个为一组收集插入(这里 50 仅用作示例..)。 order_inserts 属性 告诉 Hibernate 花时间按实体对插入进行分组,从而创建更大的批次。
那么你应该在显式或隐式刷新之间进行选择。
- 隐式:只需设置批处理大小 属性,剩下的由 hibernate 完成。
- 显式
flush
和clear
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。
休眠批处理选项不适用于 IdGenerator IDENTITY
,因此您不能使用具有 mysql 的 AUTO-INCREMENT
功能的批处理插入。由于 MySQL 中不存在序列生成,因此您只能使用 TABLE
生成器。但是 table 生成器的性能不如身份生成器。
提一下 Vlad mihalcea(引自他的名著High Performance Java Persistence
)
When using MySQL and need lot of inserts It is a good idea to use JOOQ framework for that.