`

用spring控制hibernate的session何时关闭

 
阅读更多

在用spring管理hierbernate的事务我们一般都用TransactionProxyFactoryBean去配置我们的Service方法.

如.

<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
         <property name="transactionManager"><ref bean="transactionManager"/></property>
         <property name="transactionAttributes">
             <props>
     <prop key="*">PROPAGATION_REQUIRED</prop>
     <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
     <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>         
     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>     
             </props>
         </property>
     </bean>

<!-- <bean id="userManager" parent="baseTxProxy">
         <property name="target">
             <bean class="com.javaeye.user.impl.hibernate.UserManagerImpl" >
                 <property name="cacheQueries"><value>true</value></property>
             </bean>
         </property>
     </bean>
-->       

<bean id="userService" parent="baseTxProxy">
   <property name="target">
    <bean class="com.dengyin.report.service.impl.UserServiceImpl" />
   </property>
</bean>

<bean id="dailyReportService" parent="baseTxProxy">
   <property name="target">
    <bean class="com.dengyin.report.service.impl.DailyReportServiceImpl" />
   </property>
</bean>

我们可以想得到TransactionProxyFactoryBean是使用aop在Service方法之前open 一个session, begin Trans.在Service结束之后Commit Trans, close session.

但是我们使用spring的OpenSessionInViewFilter的时候就不能在Service方法后close session了. 应该是在Render page之后再关闭session的.所以我跟踪了spring的代码. 最后发现了spring是怎样做的.

    HibernateTransactionObject txObject = (HibernateTransactionObject) transaction;
    if (txObject.getSessionHolder() == null) {
     Interceptor entityInterceptor = getEntityInterceptor();
     Session newSession = (entityInterceptor != null ?
       getSessionFactory().openSession(entityInterceptor) : getSessionFactory().openSession());
     if (logger.isDebugEnabled()) {
      logger.debug("Opened new Session [" + newSession + "] for Hibernate transaction");
     }
     txObject.setSessionHolder(new SessionHolder(newSession), true);
    }

    txObject.getSessionHolder().setSynchronizedWithTransaction(true);
    session = txObject.getSessionHolder().getSession();

这段代码是在进行Service之前的. 如果当前thread没有session的话就执行txObject.setSessionHolder(new SessionHolder(newSession), true);注意这里set了一个true值. 我们来看看txObject是一个什么东西.

private static class HibernateTransactionObject extends JdbcTransactionObjectSupport {

   private SessionHolder sessionHolder;

   private boolean newSessionHolder;

   public void setSessionHolder(SessionHolder sessionHolder, boolean newSessionHolder) {
    this.sessionHolder = sessionHolder;
    this.newSessionHolder = newSessionHolder;
   }

   public SessionHolder getSessionHolder() {
    return sessionHolder;
   }

   public boolean isNewSessionHolder() {
    return newSessionHolder;
   }

   public boolean hasTransaction() {
    return (this.sessionHolder != null && this.sessionHolder.getTransaction() != null);
   }

   public void setRollbackOnly() {
    getSessionHolder().setRollbackOnly();
    if (getConnectionHolder() != null) {
     getConnectionHolder().setRollbackOnly();
    }
   }

   public boolean isRollbackOnly() {
    return getSessionHolder().isRollbackOnly() ||
      (getConnectionHolder() != null && getConnectionHolder().isRollbackOnly());
   }
}

我们看看Service方法之后spring怎样close session的.

   Session session = txObject.getSessionHolder().getSession();
   if (txObject.isNewSessionHolder()) {
    if (logger.isDebugEnabled()) {
     logger.debug("Closing Hibernate Session [" + session + "] after transaction");
    }
    SessionFactoryUtils.releaseSession(session, getSessionFactory());
   }
   else {
    if (logger.isDebugEnabled()) {
     logger.debug("Not closing pre-bound Hibernate Session [" + session + "] after transaction");
    }
    if (txObject.getSessionHolder().getPreviousFlushMode() != null) {
     session.setFlushMode(txObject.getSessionHolder().getPreviousFlushMode());
    }
   }
   txObject.getSessionHolder().clear();

当txObject.isNewSessionHolder()的时候才会close   session.

总结:

所以当Service方法之间没有存在的session时spring会开一session,然后结束的时候close session.

当Service方法之间有存在的session的话,Service方法结束时并没有关闭   session.

分享到:
评论

相关推荐

    Spring与Hibernate集成

    在Spring中,我们通常使用`LocalSessionFactoryBean`来创建Hibernate的SessionFactory,并通过`HibernateTemplate`或`SessionFactory`接口进行数据访问操作。`SessionFactory`是一个线程安全的工厂,用于创建`...

    springmvc+spring+hibernate

    Spring MVC、Spring 和 Hibernate 是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个强大而灵活的后端架构。Spring MVC 负责处理HTTP请求并将其路由到相应的控制器,Spring 提供了依赖注入(DI)和面向...

    spring mvc + spring + hibernate 全注解整合开发视频教程 12

    在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第12部分,将帮助开发者掌握如何在Java Web项目中高效地集成这三个核心框架,实现松耦合、可...

    非注解Springmvc+spring+hibernate 入门实例

    同时,你还需要配置一个Hibernate的本地SessionFactory Bean,以便Spring能够管理和控制Hibernate的生命周期。 总的来说,这个入门实例旨在帮助初学者理解如何在没有使用注解的情况下,通过XML配置文件集成...

    spring与hibernate的整合

    在 Spring 中使用 Hibernate 通常有两种方式:一是使用 HibernateTemplate 或 HibernateDaoSupport,另一种是直接使用 Hibernate 的原生 API。这里我们关注后者,通过 Spring 注入 SessionFactory 到 DAO 类中,然后...

    Spring+hibernate整合源代码

    1. **依赖注入**:Spring 提供的 DI(Dependency Injection)机制可以帮助管理 Hibernate SessionFactory 和 Session 实例,避免手动创建和管理这些对象。在配置文件中定义 SessionFactory 的 Bean,然后通过注解或 ...

    Struts2,Spring,Hibernate jar包下载

    Struts2、Spring和Hibernate是Java开发中三大主流的开源框架,它们分别专注于Web层、业务层和服务层的管理,组合使用可以构建出强大的企业级应用。这些框架的jar包是开发人员日常工作中必不可少的工具。 **Struts2*...

    Spring与Hibernate集成中的session

    本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为一个轻量级的框架,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,它可以帮助我们解耦应用程序...

    Hibernate Session释放模式

    这是最常见的Session管理方式,通常与Spring的@Transactional注解结合使用。每个数据库事务开始时创建Session,事务结束时关闭Session。这种方式简单且易于理解,能保证事务的ACID特性,但可能会导致大量的短连接,...

    spring-hibernate3.jar.zip

    其次,Spring的ApplicationContext可以加载Hibernate的相关配置,如SessionFactory,进而创建Session对象,进行数据库操作。同时,Spring还可以通过Bean工厂来管理Hibernate的实体类,实现数据持久化。 在配置上,...

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    然而,在使用 Hibernate 进行数据库操作时,经常会遇到 "No Hibernate Session bound to thread" 的错误信息。本文将详细介绍该错误的解决方案。 错误原因 "No Hibernate Session bound to thread" 错误信息通常是...

    Spring整合Hibernate案例

    - **创建DAO接口和实现**:设计DAO接口,然后用Hibernate的Session作为基础实现数据操作方法。 - **使用HibernateTemplate**:Spring提供了一个`HibernateTemplate`类,简化了对Session的操作,可以减少代码量和...

    spring整合hibernate示例代码

    这个示例代码可能包含了一个简单的SSH项目,展示了如何配置Spring的IoC(Inversion of Control,控制反转)容器来管理Hibernate的Session,以及如何在业务逻辑层和数据访问层之间建立联系。 "示例代码"意味着我们将...

    spring+hibernate整合简单示例

    2. **SessionFactory和Session的管理**:Spring提供了一个HibernateTemplate或HibernateDaoSupport类,帮助我们管理SessionFactory和Session,使得在Spring环境下使用Hibernate变得更加方便。这些类会自动处理...

    Spring+Hibernate整合

    这种整合能够充分利用Spring的管理能力,对Hibernate进行配置和控制,同时利用Spring的数据访问支持,如JdbcTemplate或HibernateTemplate,来简化数据操作。 在整合过程中,首先需要配置Spring的ApplicationContext...

    Spring整合Hibernate.jar

    标题"Spring整合Hibernate.jar"意味着我们将讨论如何将这两个强大的框架集成在一起,以便在Spring管理的环境中使用Hibernate进行数据库操作。这通常涉及到以下步骤和知识点: 1. **引入依赖**:首先,你需要在项目...

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession)); ``` 然后,在类中加入以下两个私有函数: ```java private SessionFactory lookupSessionFactory...

    spring-hibernate jar包

    在 Spring 和 Hibernate 集成中,c3p0 可以作为数据源配置,用于管理数据库连接,避免频繁创建和关闭连接带来的性能开销。 在实际应用中,开发者通常会使用 Spring 的 `LocalSessionFactoryBean` 来配置 Hibernate ...

    Spring与hibernate 整合 简单示例

    在实现类中,我们可以使用Hibernate的Session来执行CRUD操作: ```java import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; ...

    spring_hibernate整合实例

    Spring是一个全面的Java应用框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,而Hibernate是一个ORM(对象关系映射)框架,用于简化数据库操作。当我们谈论"spring_hibernate整合实例"时,...

Global site tag (gtag.js) - Google Analytics