`
bto310
  • 浏览: 13441 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Hibernate session关闭策略

 
阅读更多
Hibernate中session是使用最频繁的对象,我们需要对session进行有效管理,即在执行数据库操作前打开session,在执行操作后关闭session。



对session的管理有两种场景:



1) 没有和Spring集成,我们自己管理

  

      我们调用Hibernate的sessionFactory.openSession()方法,即可创建一个新的session,使用完毕后将它关闭,这是最原始,最简单的管理。但为提高复用,一般我们还会在线程范围内缓存这个session,即一个线程范围内始终使用同一个session。这点可用ThreadLocal变量实现。

      这种方式里,session的关闭,以及事务的操作,都需要我们自己来做。     



      另外,在最新的Hibernate中,已经内置了线程范围的session管理机制,我们只需在Hibernate配置文件中指定hibernate.current_session_context_class为thread,然后调用sessionFactory.getCurrentSession(),即可得到与当前线程绑定的session。

      但这种方式要求在一个transactional环境里使用,即我们要显示的进行事务控制(否则会抛出异常)。session也会在事务提交或回滚时被自动关闭。



2) 和Spring集成,利用Spring管理机制



      由于Spring有自己的session与线程绑定管理,因此不需要再在需在Hibernate配置文件中指定hibernate.current_session_context_class为thread,否则会出错。



      一般我们会继承自Spring的HibernateDAOSupport,然后如果使用Spring的getHibernateTemplate来做数据操作时,Spring将对session进行自动管理,不需手动关闭,而且即使我们没有进行transaction,Spring也会自动进行事务的开始与提交。

      如果我们没有使用getHibernateTemplate,而是用geSession接口得到session对象来做后续操作时,如果是在一个transactional环境里,即我们手动创建并控制事务时,session会被自动关闭。但是如果没有进行事务控制,我们每次得到的都是新创建的session,必须手动关闭。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics