Hibernate大数据量操作解决方案

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

下面是一个测试method。

1  /** */ /**2   * 测试成批插入数据的事务处理,返回是否成功3   *4   * @param objPO Object5   * @return boolean6    */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 memory17           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) {23    while (true) {4      //do your business with the opening session5      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

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

还等什么,赶快试试吧!

你所缺少的部分,也早已被我用想像的画笔填满。

Hibernate大数据量操作解决方案

相关文章:

你感兴趣的文章:

标签云: