快速业务通道

Hibernate大数据量操作解决方案 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Hibernate大数据量操作解决方案

时间:2011-08-13 重明鸟

阅读了Hibernate的Reference之后,可以采用批量处理的方法,当插入的数据超过10000时,就flush session并且clear。

下面是一个测试method。

1  /** */ /** 2   * 测试成批插入数据的事务处理,返回是否成功 3   * 4   * @param objPO Object 5   * @return boolean 6    */ 7    public  boolean insertBatch( final Object objPO)  { 8     boolean isSuccess =  false ; 9     Transaction transaction =  null ; 10     Session session = openSession(); 11      try  { 12       transaction = session.beginTransaction(); 13        for ( int i =  0 ; i <  100000 ; i ++ )  { 14         session.save(objPO); 15          if (i %  50  ==  0 )  { 16           // flush a batch of inserts and release memory 17           session.flush(); 18           session.clear(); 19         } 20       } 21       transaction.commit(); 22       logger.info( " transaction.wasCommitted: " 23           + transaction.wasCommitted()); 24       isSuccess =  true ; 25     }  catch (HibernateException ex)  { 26        if (transaction !=  null )  { 27          try  { 28           transaction.rollback(); 29           logger.error( " transaction.wasRolledBack: " 30               + transaction.wasRolledBack()); 31         }  catch (HibernateException ex1)  { 32           logger.error(ex1.getMessage()); 33           ex1.printStackTrace(); 34         } 35       } 36       logger.error( " Insert Batch PO Error: "  + ex.getMessage()); 37       ex.printStackTrace(); 38     }  finally  { 39        if (transaction !=  null )  { 40         transaction =  null ; 41       } 42       session.close(); 43     } 44     return isSuccess; 45   } 46 

Hibernate大数据量操作解决方案(2)

时间:2011-08-13 重明鸟

这只是简单的测试,实际项目中遇到的问题,要比这个复杂得多。

这时候,我们可以让Spring来控制Transaction,自己来控制Hibernate的Session,随时更新数据。

首先,利用HibernateDaoSupport类来自定义个方法打开Session;

1public Session openSession(){ 2     3    return getHibernateTemplate().getSessionFactory().openSession(); 4     5  }然后,用打开的Session处理你的数据; 1protected void doBusiness(Session session) { 2 3    while (true) { 4      //do your business with the opening session 5      someMethod(session); 6      session.flush(); 7      session.clear(); 8      logger.info("good job!"); 9    }    10}

每做一次数据操作,就更新一次Session,这样可以保证每次数据操作都成功,否则就让Spring去控制 它roll back吧。

最后,记得关闭Session。

1 Session session = openSession(); 2 doBusiness(session); 3 session.close(); // 关闭session

至于处理速度呢,不会慢到哪儿去的,已经试验过了。; - )

还等什么,赶快试试吧!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号