gpt4 book ai didi

java - 使用 JPA + Hibernate 进行大量插入

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:04 25 4
gpt4 key购买 nike

我需要使用 EJB 3、Hibernate、Spring Data 和 Oracle 进行大量插入。最初,我使用的是 Spring Data,代码如下:

talaoAITDAO.save(taloes);

其中 talaoAITDAO 是 Spring Data JpaRepository子类和 taloes 是 TalaoAIT 实体的集合。在此实体中,其各自的 ID 具有以下形式:

@Id
@Column(name = "ID_TALAO_AIT")
@SequenceGenerator(name = "SQ_TALAO_AIT", sequenceName = "SQ_TALAO_AIT", allocationSize = 1000)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_TALAO_AIT")
private Long id;

此外,该实体没有相关实体可以进行级联插入。

我的问题是,所有实体都是单独插入的(例如 INSERT INTO TABLE(col1, col2) VALUES (val1, val2))。有时,它会导致超时,所有插入都将回滚。我想在批量插入中转换这些单独的插入(例如 INSERT INTO TABLE(col1, col2) VALUES (val11, val12), (val21, val22), (val31, val32), ... ).

研究提高性能的替代方案,我发现 this page在 hibernate 文档中,超越 Hibernate batch size confusionthis other page .基于它们,我编写了这段代码:

Session session = super.getEntityManager().unwrap(Session.class);
int batchSize = 1000;
for (int i = 0; i < taloes.size(); i++) {
TalaoAIT talaoAIT = taloes.get(i);
session.save(talaoAIT);
if(i % batchSize == 0) {
session.flush();
session.clear();
}
taloes.add(talaoAIT);
}
session.flush();
session.clear();

此外,在 peristence.xml 中,我添加了这些属性:

<property name="hibernate.jdbc.batch_size" value="1000" />
<property name="order_inserts" value="true" />

然而,尽管在我的测试中我发现了细微的差别(主要是大集合和大批量大小),但它并没有理想中的那么大。在日志控制台中,我看到 Hibernate 继续执行单独的插入,而不是将它们替换为大量插入。在我的实体中,我使用的是序列生成器,我相信这不是问题(根据 Hibernate 文档,如果我使用身份生成器,我会遇到问题)。

所以,我的问题是这里可能缺少什么。一些配置?有没有用到的方法?

谢谢,

拉斐尔·阿方索。

最佳答案

一些事情。

首先你的配置属性是错误的 order_inserts 必须是 hibernate.order_inserts 。目前你的设置被忽略,你没有改变任何东西。

接下来使用 EntityManager 而不是执行所有那些令人讨厌的 hibernate 操作。 EntityManager 还有一个 flushclear 方法。这至少应该清理你的方法。如果没有顺序,这有助于清理 session 并防止对其中所有对象进行脏检查。

EntityManager em = getEntityManager();
int batchSize = 1000;
for (int i = 0; i < taloes.size(); i++) {
TalaoAIT talaoAIT = taloes.get(i);
em.persist(talaoAIT);
if(i % batchSize == 0) {
em.flush();
em.clear();
}
taloes.add(talaoAIT);
}
em.flush();
em.clear();

接下来你不应该让你的批处理太大,因为这会导致内存问题,从 50 开始并测试哪个/什么表现最好。有一个点,脏检查将花费更多时间然后刷新和清除数据库。你想找到这个甜蜜点。

关于java - 使用 JPA + Hibernate 进行大量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20285347/

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