posts - 40,  comments - 187,  trackbacks - 0
阅读了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

这只是简单的测试,实际项目中遇到的问题,要比这个复杂得多。
这时候,我们可以让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


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

还等什么,赶快试试吧!

 
                                                                               THE END

posted on 2007-01-11 17:12 小立飞刀 阅读(4874) 评论(3)  编辑  收藏 所属分类: Hibernate

FeedBack:
# re: Hibernate大数据量操作解决方案
2007-01-13 22:54 | 小车马
请问楼主,你们在项目中也是这么做的吗  回复  更多评论
  
# re: Hibernate大数据量操作解决方案
2007-01-15 10:46 | 小雪飞刀
不错,我在项目中就是按照这个思路做的  回复  更多评论
  
# re: Hibernate大数据量操作解决方案
2010-12-04 10:25 | 潇湘振宇
这个解决方案还是有问题的,我测试过通过这种方式插入20万的数据量,还勉强能够接受,完成此操作我的PC耗时1分多钟,服务层的处理很快,慢还是慢在Spring的事务提交。
如果插入25万及以上的数据量时,就会出现内存溢出了!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

生存或毁灭,这是个必答之问题:是否应默默的忍受坎苛命运之无情打击,还是应与深如大海之无涯苦难奋然为敌,并将其克服。此二抉择,究竟是哪个较崇高?

常用链接

留言簿(12)

随笔分类(43)

相册

收藏夹(7)

朋友的博客

电子资料

搜索

  •  

积分与排名

  • 积分 - 301826
  • 排名 - 192

最新评论

阅读排行榜

评论排行榜