第 13 章 批量处理(Batch processing)

目录

  • 13.1. 批量插入(Batch inserts)
  • 13.2. 批量更新(Batch updates)
  • 13.3. StatelessSession (无状态session)接口
  • 13.4. DML(数据操作语言)风格的操作(DML-style operations)

使用Hibernate将 100 000 条记录插入到数据库的一个很自然的做法可能是这样的

  1. Session session = sessionFactory.openSession();
  2. Transaction tx = session.beginTransaction();
  3. for ( int i=0; i<100000; i++ ) {
  4. Customer customer = new Customer(.....);
  5. session.save(customer);
  6. }
  7. tx.commit();
  8. session.close();

这段程序大概运行到 50 000 条记录左右会失败并抛出 内存溢出异常(OutOfMemoryException) 。 这是因为 Hibernate 把所有新插入的 客户(Customer)实例在 session级别的缓存区进行了缓存的缘故。

我们会在本章告诉你如何避免此类问题。首先,如果你要执行批量处理并且想要达到一个理想的性能, 那么使用JDBC的批量(batching)功能是至关重要。将JDBC的批量抓取数量(batch size)参数设置到一个合适值 (比如,10-50之间):

  1. hibernate.jdbc.batch_size 20

<a class="calibre5 pcalibre pcalibre1" id="disablebatching"></a>注意,假若你使用了identiy标识符生成器,Hibernate在JDBC级别透明的关闭插入语句的批量执行。

你也可能想在执行批量处理时关闭二级缓存:

  1. hibernate.cache.use_second_level_cache false

但是,这不是绝对必须的,因为我们可以显式设置CacheMode来关闭与二级缓存的交互。