我应该在Hibernate中批量插入/更新吗?

时间:2018-10-10 15:34:56

标签: java sql-server hibernate

对于更新多个实体的功能,我有些疑问,但它会一个接一个地执行。当然,如果我们使用远程数据库,则可能会存在延迟问题,但是除此之外,我担心会由于一个事务中要更新的实体数量而导致OutOfMemoryException。我的代码类似于下面的代码。

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

这是一个示例,在另一种方法中我们也有类似的情况,但有插入项。这些方法可以在一笔交易中更新或插入多达2k或3k实体。所以我的问题是,我们应该开始使用批处理操作还是实体数量不足以担心它?另外,如果执行批处理操作,效果会更好吗?

1 个答案:

答案 0 :(得分:1)

优化事物时,请始终问自己是否值得,例如:

  1. 这些方法是每晚运行的批处理还是经常被调用的东西?
  2. 性能提升足够高还是可以忽略不计?

无论如何,在一个事务中〜3k个实体听起来都不错,但是即使使用这些数字,jdbc批处理也有好处(也很easy才能实现)。

Kinda很难说出何时应该担心OutOfMemoryException,因为它取决于为jvm提供多少内存以及要更新的实体有多大。只是给你一些数字,当我不得不在同一事务中使用4Gb内存插入大约10万到10万行时,我个人遇到了内存问题,我不得不不时刷新和清空休眠缓存。