gpt4 book ai didi

java - 如何持久化大量实体 (JPA)

转载 作者:太空狗 更新时间:2023-10-29 22:45:24 26 4
gpt4 key购买 nike

我需要处理一个 CSV 文件并为每条记录(行)保留一个实体。现在,我这样做:

while ((line = reader.readNext()) != null) {
Entity entity = createEntityObject(line);
entityManager.save(entity);
i++;
}

save(Entity) 方法基本上只是一个 EntityManager.merge() 调用。 CSV 文件中大约有 20,000 个实体(行)。这是一种有效的方法吗?它似乎很慢。使用 EntityManager.persist() 会更好吗?此解决方案是否存在任何缺陷?

编辑

这是一个漫长的过程(超过 400 秒),我尝试了两种解决方案,persistmerge。两者完成所需的时间大致相同(459 秒对 443 秒)。问题是像这样一个一个地保存实体是否是最佳的。据我所知,Hibernate(这是我的 JPA 提供程序)确实实现了一些缓存/刷新功能,因此我不必担心这一点。

最佳答案

JPA API 并未为您提供所有选项以实现最佳效果。根据您想要执行此操作的速度,您将不得不寻找特定于 ORM 的选项 - 在您的情况下为 Hibernate。

要检查的事情:

  1. 检查您使用的是单笔交易(是的,显然您确信这一点)
  2. 检查您的 JPA 提供程序 (Hibernate) 是否正在使用 JDBC 批处理 API(请参阅:hibernate.jdbc.batch_size)
  3. 检查您是否可以绕过获取生成的 key (取决于 db/jdbc 驱动程序您从中获得多少好处 - 引用:hibernate.jdbc.use_getGeneratedKeys)
  4. 检查您是否可以绕过级联逻辑(仅从中获得最小的性能优势)

所以在 Ebean ORM 中,这将是:

    EbeanServer server = Ebean.getServer(null);

Transaction transaction = server.beginTransaction();
try {
// Use JDBC batch API with a batch size of 100
transaction.setBatchSize(100);
// Don't bother getting generated keys
transaction.setBatchGetGeneratedKeys(false);
// Skip cascading persist
transaction.setPersistCascade(false);

// persist your beans ...
Iterator<YourEntity> it = null; // obviously should not be null
while (it.hasNext()) {
YourEntity yourEntity = it.next();
server.save(yourEntity);
}

transaction.commit();
} finally {
transaction.end();
}

哦,如果您通过原始 JDBC 执行此操作,您将跳过 ORM 开销(更少的对象创建/垃圾收集等)——所以我不会忽略该选项。

所以是的,这并没有回答您的问题,但可能有助于您搜索更多 ORM 特定的批量插入调整。

关于java - 如何持久化大量实体 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5649345/

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