Spring管理Session何时打开何时关闭?

时间:2021-08-30 19:04:28
Spring管理Session何时打开何时关闭的呢?我在项目中直接super.getHibernateTemplate().find("");但是一直感觉到很奇怪,因为在用hibernate的时候都要打开session为什么用Spring的时候就不需要打开session呢?请高手指教,那么Session何时打开何时关闭的?

15 个解决方案

#1


+1+1+1+1+1

#2


因为spring已经帮你做了这些事情 不需要你做了

#3


spring事务已经帮你把这些都做了,不用再自己动手去打开session或关闭session

#4


事务开始到事务结束

#5


在事务开始的时候打开Session,事务完成后关闭Session,使用Hibernate和Spring都需要这个操作,只不过Spring内部封装好了方法来自动打开和关闭Session,不需要手动关闭了!

#6


因为hibernate的事务交给了SPring管理。你去看applicationCOntext.xml中就看到有事务配置。通过AOP,在你的业务方法执行前打开事务,开启session,执行后就关闭事务,关闭session.

#7


引用 2 楼 java_cxrs 的回复:
因为spring已经帮你做了这些事情 不需要你做了

+1

#8


引用 5 楼 xinghen88 的回复:
在事务开始的时候打开Session,事务完成后关闭Session,使用Hibernate和Spring都需要这个操作,只不过Spring内部封装好了方法来自动打开和关闭Session,不需要手动关闭了!


正解

#9


spring中不是把session交给org.springframework.orm.hibernate3.HibernateTransactionManager这个类管理了吗?

#10


你加入的Spring支持里不是有SessionFactory吗?你自己看看,有没有打开和关闭session的方法?????

#11


学习了

#12


会不会是这样。。。
SessionFactory sf;
public HibernateTemplate getHibernateTemplate() {
    //...
    Configuration cfg = new Configuration().configure(...xml);
    sf = cfg.buildSessionFactory();
}

public List find(String hql) {
    Session session = sf.openSession();
    session....
    session.close();
}

#13


继续  。。。高手呢?

#14


一般来说spring内部已经封装了对Hibernate的session的开启和关闭,但是是它是在你用到super.getHibernateTemplate()时就会开启session,用完session就会关闭,事务就会自动提交 LZ如果想要控制session的开启和关闭,可以在application.xml里进行事务通知配置

 <!--配置事务管理器-->
<bean id="myManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"></property>
<tx:advice id="txAdvice" transaction-manager="myManager">

<tx:attributes>
<!--配置需要事务提交的方法-->
<tx:method name="find*"  propagation="SUPPORTS"/><!--在查询方法执行完后事务不需进行提交-->
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/><!--在执行增加数据的时候需要提交,这时只有add方法执行完session才会关闭,事务就会提交-->

</tx:attributes>
</tx:advice>


<aop:config>

<aop:pointcut expression="execution(* .*.* (..))" id="pc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>


#15


另外要想让session持续一段时间再关闭还可以在web.xml中进行OpenSessionInViewFilter配置

<filter>
   <filter-name>hibernateFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
   <init-param>
   <param-name>singleSession</param-name>
   <param-value>true</param-value>
   </init-param>
  </filter>
  <filter-mapping>
   <filter-name>hibernateFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
  


这样只有当当前请求(request)关闭,session才会相应关闭,LZ可以google这方面的资料

#1


+1+1+1+1+1

#2


因为spring已经帮你做了这些事情 不需要你做了

#3


spring事务已经帮你把这些都做了,不用再自己动手去打开session或关闭session

#4


事务开始到事务结束

#5


在事务开始的时候打开Session,事务完成后关闭Session,使用Hibernate和Spring都需要这个操作,只不过Spring内部封装好了方法来自动打开和关闭Session,不需要手动关闭了!

#6


因为hibernate的事务交给了SPring管理。你去看applicationCOntext.xml中就看到有事务配置。通过AOP,在你的业务方法执行前打开事务,开启session,执行后就关闭事务,关闭session.

#7


引用 2 楼 java_cxrs 的回复:
因为spring已经帮你做了这些事情 不需要你做了

+1

#8


引用 5 楼 xinghen88 的回复:
在事务开始的时候打开Session,事务完成后关闭Session,使用Hibernate和Spring都需要这个操作,只不过Spring内部封装好了方法来自动打开和关闭Session,不需要手动关闭了!


正解

#9


spring中不是把session交给org.springframework.orm.hibernate3.HibernateTransactionManager这个类管理了吗?

#10


你加入的Spring支持里不是有SessionFactory吗?你自己看看,有没有打开和关闭session的方法?????

#11


学习了

#12


会不会是这样。。。
SessionFactory sf;
public HibernateTemplate getHibernateTemplate() {
    //...
    Configuration cfg = new Configuration().configure(...xml);
    sf = cfg.buildSessionFactory();
}

public List find(String hql) {
    Session session = sf.openSession();
    session....
    session.close();
}

#13


继续  。。。高手呢?

#14


一般来说spring内部已经封装了对Hibernate的session的开启和关闭,但是是它是在你用到super.getHibernateTemplate()时就会开启session,用完session就会关闭,事务就会自动提交 LZ如果想要控制session的开启和关闭,可以在application.xml里进行事务通知配置

 <!--配置事务管理器-->
<bean id="myManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"></property>
<tx:advice id="txAdvice" transaction-manager="myManager">

<tx:attributes>
<!--配置需要事务提交的方法-->
<tx:method name="find*"  propagation="SUPPORTS"/><!--在查询方法执行完后事务不需进行提交-->
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/><!--在执行增加数据的时候需要提交,这时只有add方法执行完session才会关闭,事务就会提交-->

</tx:attributes>
</tx:advice>


<aop:config>

<aop:pointcut expression="execution(* .*.* (..))" id="pc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>


#15


另外要想让session持续一段时间再关闭还可以在web.xml中进行OpenSessionInViewFilter配置

<filter>
   <filter-name>hibernateFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
   <init-param>
   <param-name>singleSession</param-name>
   <param-value>true</param-value>
   </init-param>
  </filter>
  <filter-mapping>
   <filter-name>hibernateFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
  


这样只有当当前请求(request)关闭,session才会相应关闭,LZ可以google这方面的资料