Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  java  >  正文 Hibernate下数据批量处理解决方案

Hibernate下数据批量处理解决方案

发布时间:2019-10-06   编辑:www.jquerycn.cn
jquery中文网为您提供Hibernate下数据批量处理解决方案等资源,欢迎您收藏本站,我们将为您提供最新的Hibernate下数据批量处理解决方案资源
很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头,由此延伸,那么就会认为ORM可能也不是特别适合数据的批量处理。
 其实,我想如果我们应用得当的话,完全可以消除ORM批量处理性能问题这方面的顾虑。下面以Hibernate为例来做为说明,假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话。
 向数据库插入100 000条数据,用Hibernate可能像这样:
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条的时候,就会出现内存溢出而失败。这是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(); }
}
tx.commit();
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);

您可能感兴趣的文章:
Hibernate下数据批量处理解决方案
Hibernate批量插入数据到数据库
Java中Hibernate单向(1-N)映射实例详解
java中Hibernate中的数据库对象详解
什么是批处理
Hibernate学习笔记之基本配置详解
java中Hibernate多对多双向关联的配置
使用MiddleGen 产生hibernate的数据库表映射文件
Hibernate含List属性的持久化类的CRUD操作范例
db2和mysql的区别是什么

[关闭]