Spring+Hibernate处理大批量数据

Spring+Hibernate处理大批量数据原文:http://blog.csdn.net/ye1992/article/details/9291237关于使用spring+hibernate进行大批量数据的插入和更新,它的性能和使用JDBC PreparedStatement的batch批量操作以及数据库的存储过程操作几乎可以一样高。在Hibernate的官方文档里说到了Batchprocessing。Spring+Hib

原文:http://blog.csdn.net/ye1992/article/details/9291237

关于使用spring+hibernate进行大批量数据的插入和更新,它的性能和使用JDBC 

PreparedStatement的batch批量操作以及数据库的存储过程操作几乎可以一样高。在Hibernate的官方文档里说到了BatchprocessingSpring+Hibernate大批量处理数据想要说明如何使用Hibernate大批量处理数据获得高性能。

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

Session session = sessionFactory.openSession();  Transaction tx = session.beginTransaction();  for ( int i=0; i<100000; i++ ) {      Customer customer = new Customer(.....);      session.save(customer);  }  tx.commit();  session.close();

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

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

hibernate.jdbc.batch_size 20

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

hibernate.cache.use_second_level_cache false

14.1. 批量插入(Batch inserts)

如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。

Session session = sessionFactory.openSession();  Transaction tx = session.beginTransaction();       for ( int i=0; i<100000; i++ ) {      Customer customer = new Customer(.....);      session.save(customer);      if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同          //flush a batch of inserts and release memory:          //将本批插入的对象立即写入数据库并释放内存          session.flush();          session.clear();      }  }       tx.commit();  session.close();

14.2. 批量更新(Batch updates)

此方法同样适用于检索和更新数据。此外,在进行会返回很多行数据的查询时,你需要使用 scroll() 方法以便充分利用服务器端游标所带来的好处。

Session session = sessionFactory.openSession();  Transaction tx = session.beginTransaction();       ScrollableResults customers = session.getNamedQuery("GetCustomers")      .setCacheMode(CacheMode.IGNORE)      .scroll(ScrollMode.FORWARD_ONLY);  int count=0;  while ( customers.next() ) {      Customer customer = (Customer) customers.get(0);      customer.updateStuff(...);      if ( ++count % 20 == 0 ) {          //flush a batch of updates and release memory:          session.flush();          session.clear();      }  }       tx.commit();  session.close();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35879.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注