好像是Session有问题,但又不知道如何解决

解决方案 »

  1.   

    我感觉应该是tx.rollback();的问题,应该不需要这句话,当不成功的话,就不会执行tx.commit();你可以把这句话去掉试试
      

  2.   

    1.你只是查询,查询还需要事务处理吗?
    2.你可以在配置文件中配置上事务处理的相关内容,那样就不需要在程序中进行明码的事务处理啦
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"
    autowire="byName" />
    <bean id="matchAllWithPropReq"
    class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
    <property name="transactionAttribute">
    <value>PROPAGATION_REQUIRED</value>
    </property>
    </bean>
    <bean id="matchAllTxInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
    <ref bean="transactionManager" />
    </property>
    <property name="transactionAttributeSource">
    <ref bean="matchAllWithPropReq" />
    </property>
    </bean>
      

  3.   

    谢谢sureyor,不过我是没有用到spring的,仅仅是用到了struts+hibernate
    另外查询不需要事务处理的话,那么在后续的操作还是需要事务的,比如插入。
    我想这个问题并不是因为使用事务而出的错,主要还是Session使用时有问题。我用断点跟踪了一下,发现是DBOperate.java里的这一句List list = q.list();抛出的错误。
    还请各位帮助找到真正的问题
      

  4.   

    你发生异常后没有关闭session
    } catch (HibernateException e) {
    if (tx != null)
    tx.rollback();
    throw e;
    }
    应该加入
    finally {
      HibernateUtil.closeSession();
    }
      

  5.   

    个人觉得最有可能的也是关闭Session这里的问题,当发生异常的时候没有关闭Session,这样就有可能导致数据库连接不能释放,到最后可能就没有数据库连接可用了。就像sureyor() 所说,你可以吧session的关闭放在finally中再试试。
      

  6.   

    我也是遇到类似的问题,在服务器上发现数据库端口有很多 CLOSE_WAIT的连接,是不是和这个有关?
      

  7.   

    我也出现了类似的问题,就是用jdbc没有问题,而用jndi就有问题了