论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
Hibernate下数据批量处理解决方案
 作者:佚名     2007-3-14 17:26:42        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

很多人都对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);
  customer.updateStuff(...);
  if ( ++count % 20 == 0 ) {
  //flush 更新数据和释放内存:
  session.flush(); session.clear(); } }
  tx.commit(); session.close();
  
  这种做法并不困难,也不算不优雅。请注意,如果Customer启用了second-level caching ,我们仍然会有一些内存管理的问题。原因就是对于用户的每一次插入和更新,Hibernate在事务处理结束后不得不通告second-level cache 。因此,我们在批处理情况下将要禁用用户使用缓存


责任编辑:lss
  相关新闻
数据库之——Hibernate实现级联删除
Google回应维亚康母的起诉 称YouTube未侵权
Spring VS. HiveMind
Struts开发指南之Taglib的初步了解
快速上手Spring--5.Bean的标志符
Hibernate为什么如此成功?
欧盟同意甲骨文58.5亿美元收购Siebel
媒体巨头起诉Google和YouTube 赔偿10亿美元
巨头联手 IBM与Google合推桌面即时可用服务
Hibernate:用hbm2java生成Hibernate类
欧盟同意甲骨文58.5亿美元收购Siebel
Oracle IBM 化对手为伙伴 结盟共创IACC
Google回应维亚康母的起诉 称YouTube未侵权
MTV网络起诉YouTube获时代华纳等同行支持
巨头联手 IBM与Google合推桌面即时可用服务
媒体巨头起诉Google和YouTube 赔偿10亿美元
Hibernate为什么如此成功?
Struts开发指南之Taglib的初步了解
快速上手Spring--5.Bean的标志符
Thinking in AJAX(三)——AJAX框架汇总
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号