知识大全 Hibernate下数据批量处理解决方案
Posted 知
篇首语:构成我们学习最大障碍的是已知的东西,而不是未知的东西。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate下数据批量处理解决方案相关的知识,希望对你有一定的参考价值。
Hibernate下数据批量处理解决方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头 由此延伸 那么就会认为ORM可能也不是特别适合数据的批量处理 其实 我想如果我们应用得当的话 完全可以消除ORM批量处理性能问题这方面的顾虑 下面以Hibernate为例来做为说明 假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话 向数据库插入 条数据 用Hibernate可能像这样 Session session = sessionFactory openSession(); Transaction tx = session beginTransaction(); for ( int i= ; i<100000; i++ ) Customer customer = new Customer(.....); session.save(customer); mit(); session.close(); 大概在运行到第50 000条的时候,就会出现内存溢出而失败。Tw.WiNGwIt.这是Hibernate把最近插入的Customer都以session-level cache在内存做缓存,我们不要忘记Hiberante并没有限制first-level cache 的缓存大小: # 持久对象实例被管理在事务结束时,此时Hibernate与数据库同步任何已经发生变 化的被管理的的对象。 # Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理。 这里,我给出Hibernate如何实现批量插入的方法: 首先,我们设置一个合理的JDBC批处理大小,hibernate.jdbc.batch_size 20。 然后在一定间隔对Session进行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 ) //flush 插入数据和释放内存: session.flush(); session.clear(); mit(); session.close(); 那么,关于怎样删除和更新数据呢?那好,在Hibernate2.1.6或者更后版本,scroll() 这个方法将是最好的途径: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); ScrollableResults customers = session.getNamedQuery("GetCustomers") .scroll(ScrollMode.FORWARD_ONLY); int count=0; while ( customers.next() ) Customer customer = (Customer) customers.get(0); customer.updateStuff(...); if ( ++count % 20 == 0 ) //flush 更新数据和释放内存: session.flush(); session.clear(); mit(); session.close(); 这种做法并不困难,也不算不优雅。请注意,如果Customer启用了second-level caching ,我们仍然会有一些内存管理的问题。原因就是对于用户的每一次插入和更新,Hibernate在事务处理结束后不得不通告second-level cache 。因此,我们在批处理情况下将要禁用用户使用缓存。 cha138/Article/program/Java/ky/201311/28117相关参考