多次点击一个查询按钮,点击的快了,就会出现session is closed异常,在方法里看了一下,是因为同时进行了两次getSession,前一次的session.close()把session关闭了,第二个session就得不到了,有没有什么好的解决办法

解决方案 »

  1.   

    延时加载,可以将lazy 设置为false, 或是配置OpenSessionInViewFilter(建议使用)
      

  2.   

    可以参考 
    http://blogger.org.cn/blog/more.asp?name=lhwork&id=20911
      

  3.   


    个人感觉不会是你说的原因的。除非你点击的速度是光速。可能是你程式的架构有问题,要不然的话,不管你点击多少次,最多只会请求多个Sesssin而已,不会出现共用Session现象吧。你是自己手动管理 Session吗?
      

  4.   

    这个我也遇到过,但是我那时没有用到hibernate
      

  5.   

    如果你自己的方式,就是多线程同步的问题,考虑在你的方法前加synchronized;
    建议你用spring 吧,让他来管理你的session
      

  6.   


    就是调用同一个查询方法,我在方法开始和结束加了两个输出
    [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])]session is open:true
    [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])]session is open:true
    [SessionImpl(<closed>)]session is open:false
    2009-11-5 9:52:44 org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet action threw exception
    org.hibernate.SessionException: Session is closed!
    我是用的spring+hibernate,应该怎样对session管理才能不会出这样的错
      

  7.   

    原来把session当成类变量了,难怪会共用一个
      

  8.   


    session当成类变量? session根本就不应该实现声明成类变量,成员变量,静态变量等,只能是局部变量,随时用,随时取得,随时关闭就好了。用了 Spring,为为什么还要自己管理 Session关闭?在 Spring配置文件为 Hibernate 配置 SessionFactory,然后用 Spring 提供的工具类获取 Session就可以了,不用考虑关闭,Spring会帮你做。Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
      

  9.   


    我用super.getSession()得到session,可以不用关闭么,是spring自动关闭了么
      

  10.   

    可以在web.xml文件中加上 <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>false</param-value>
            </init-param></filter> 
      

  11.   

    觉得楼主的程序有点乱:
    session当成类变量?没见过这么做的
    自己开关闭session?我的建议:
    如果你用了Spring对事物进行了管理,即在Spring的配置文件里面配置了sessionfactory  事务传播特性,哪些包下的那些函数参与事务,然后再你的用你的dao继承hibernatedaosupport ,这样下来你就不用关心事务了,随便用就行了,不用开启关闭。
      

  12.   

    在spring配置文件里面配置事务传播特性,是不是指用transactionInterceptor配置事务,这样是不是能够解决并发的问题
      

  13.   

    我帖子里面不是说了吗,为Hibernate 配置 SessionFactory,然后为 Hibernaet 的增删改查方法配置事物。
      

  14.   

    没配置过事务,一直都是直接getsession,然后关闭,能具体说说怎么配置么,多谢了
      

  15.   

    http://blog.csdn.net/youjianbo_han_87/archive/2009/01/19/3835920.aspx
      

  16.   


    将session绑定request这个不错
      

  17.   

    <!-- 配置sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>           

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>
    <!--事务管理对象1.注解2.xml配置-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- 配置事务的传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="save*" propagation="REQUIRED"/>
    <tx:method name="del*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="*" read-only="true"/>
    </tx:attributes>
    </tx:advice>


     <!--                                    jianmin                   -->
    <!-- 那些类的哪些方法参与事务 -->
     <aop:config>
    <aop:pointcut id="allManagerMethod" expression="execution(* com.crm.service.saleManage.*.*(..) ) "/>
    <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
    </aop:config>

     <aop:config>
    <aop:pointcut id="managerMethod" expression="execution(* com.crm.service.fu.base.*.*(..))"/>
    <aop:advisor pointcut-ref="managerMethod" advice-ref="txAdvice"/>
    </aop:config>
      

  18.   


    这个什么错误????
    userName=sa
    userPassword=sa
    session=SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
    query=QueryImpl(from User user where user.userName=? and user.password=?)
    org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at com.my.dao.impl.UserLoginDAO.isValidUser(UserLoginDAO.java:25)
    at com.my.service.impl.UserLoginService.isValidUser(UserLoginService.java:26)
    at com.my.action.LoginAction.login(LoginAction.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(