gpt4 book ai didi

mysql - Hibernate 批量插入如何工作?

转载 作者:可可西里 更新时间:2023-11-01 07:58:01 28 4
gpt4 key购买 nike

有人能解释一下吗

hibernate.jdbc.batch_size = 1000 

if (i % 100 == 0 && i > 0) {
session.flush();
session.clear();
}

一起工作?

最佳答案

hibernate 属性 hibernate.jdbc.batch_size是 hibernate 优化插入或更新语句的一种方式,而刷新循环是关于内存耗尽的。

当您尝试保存一个实体时没有 batchsize hibernate fire 1 insert 语句,因此如果您使用大集合,则每次保存 hibernate fire 1 语句。

想象一下下面的代码块:

for (Entity e : entities) {
session.save(e);
}

这里,hibernate 将为您集合中的每个实体触发 1 个插入语句。如果你的集合中有 100 个元素,那么 100 个插入语句将被触发。由于 2 个主要原因,这种方法不是很有效:

  • >
    1. 您的一级缓存呈指数增长,您可能很快就会以 OutOfMemoryException 结束。 .
  • >
    1. 由于每个语句的网络往返,您会降低性能。

hibernate.jdbc.batch_size和冲洗回路有 2 个不同的用途,但它们是互补的。

Hibernate 使用第一个来控制批处理中有多少个实体。隐藏Hibernate下的使用java.sql.Statement.addBatch(...)executeBatch()方法。

所以 hibernate.jdbc.batch_size告诉 hibernate 它必须调用多少次 addBatch()打电话前 executeBatch() .

因此设置此属性并不能防止内存耗尽。

为了保护内存,您必须定期刷新 session ,这就是刷新循环的目的。

当你写的时候:

for (Entity e : entities) {
if (i % 100 == 0 && i > 0) {
session.flush();
session.clear();
}
}

你告诉 hibernate 每 100 个实体刷新并清除 session (你释放内存)。

那么现在 2 之间的联系是什么?

为了达到最佳效果,您必须定义 jdbc.batch_size和你的冲洗参数相同。

如果您定义的刷新参数低于您选择的 batch_size,那么 hibernate 将更频繁地刷新 session ,因此它将创建小批量直到达到批量大小,这是低效的。

当 2 个相同时,如果集合的大小不是您的 batch_size 的倍数,hibernate 将只执行最佳大小的批处理,但最后一个除外。

可以看到下面的post有关最后一点的更多详细信息。

关于mysql - Hibernate 批量插入如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45670583/

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