Spring+Hibernate处理大批量数据

原文: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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值