关闭

Hibernate大数据量操作解决方案

标签: hibernatesessionspringnullreference测试
683人阅读 评论(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


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

还等什么,赶快试试吧!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:135729次
    • 积分:2051
    • 等级:
    • 排名:第18679名
    • 原创:47篇
    • 转载:87篇
    • 译文:0篇
    • 评论:2条
    最新评论