【问题标题】:Should I batch insert/update in Hibernate?我应该在 Hibernate 中批量插入/更新吗?
【发布时间】:2018-10-10 15:34:55
【问题描述】:

我对更新多个实体的功能有一些疑问,但它会一一进行。当然,如果我们使用远程数据库,可能会出现延迟问题,但除此之外,我担心我们会得到 OutOfMemoryException,因为我们在单个事务中更新的实体数量。我的代码类似于下面的代码。

EntityHeader entityHeader = entityHeaderService.findById(id);
for(EntityDetail entityDetail : entityHeader.getDetails()) {
   for(Entity entity : entityDetail.getEntities()) {
       entity.setState(true);
       entityService.update(entity);
   }
} 

这是一个例子,我们在另一种方法中也有类似的情况,但是用插入代替。这些方法可以在一个事务中更新或插入多达 2k 或 3k 个实体。所以我的问题是,我们应该开始使用批处理操作还是实体数量不够大而不必担心呢?另外,如果用批处理来做会不会更好?

【问题讨论】:

    标签: java sql-server hibernate


    【解决方案1】:

    当优化事物时,总是问自己是否值得花时间,例如:

    1. 这些方法是每晚运行的批处理还是经常调用的方法?
    2. 性能增益是否足够高或可以忽略不计?

    无论如何,一个事务中约 3k 个实体听起来不错,但即使有这些数字,jdbc 批处理也有好处(也可以通过 easy 实现)。

    很难说你什么时候应该担心OutOfMemoryException,因为这取决于你为jvm提供了多少内存以及你正在更新的实体有多大;只是为了给你一些数字,当我不得不在具有 4Gb 内存的同一事务中插入大约 10 到 10 万行之间时,我个人遇到了一些内存问题,我不得不每隔一段时间刷新和清空休眠缓存。

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 2011-11-13
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2015-07-03
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多