在server层配置了spring声明式事务,action调用server ,server调用dao。现在问题是:
我在页面上点击查询按钮,进入到action 调用server层的query方法,query方法里面去调用queryByHql,我连续点了5、6次后就卡主了。谁知道为什么?补充:
SupportDaoImpl:
public List queryByHql(final String hql, final Object[] params) 
         {
             Session s = getSession();
             Query q = s.createQuery(hql);             for (int i = 0; i < params.length; i++)
             {
        q.setParameter(i, params[i]);
    }
             return q.list();   //连续几次后就卡在这边了        
             //session.close(); //加上以后就不卡,每次session都没close了,但是事务就没有用了。    
}

解决方案 »

  1.   

    有关系,查询时对的,但是几次后会卡在q.list()那边 ,因为session还是那个session(也就是说还是在前面的那个事务中,不知道这样理解对不对?我在server配置文件中都配置了scope="prototype",而且还是两次调用,怎么还会在同一个事务中呢),就产生问题了,session关掉就不会有问题。
      

  2.   

    把spring的配置文件贴出来看看吧
      

  3.   


              
     <bean id="transactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <property name="sessionFactory">
       <ref bean="sessionFactory" />
      </property>
     </bean>
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource2"></ref>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.connection.autocommit">
    false
    </prop>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.OracleDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
    </props>
    </property>
    <property name="packagesToScan">
    <list>
    <value>com.zxh.entity.nation</value>
    </list>
    </property>
    </bean>
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName"
    value="oracle.jdbc.driver.OracleDriver">
    </property>
    <property name="url" value="${url2}"/>
    <property name="username" value="${username2}"/>
    <property name="password" value="${password2}"/>
    </bean>
    <!-- 事物切面 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="save*" />
    <tx:method name="del*" />
    <tx:method name="get*" read-only="true" />
    <tx:method name="list*" read-only="true" />
    <tx:method name="*" />
    </tx:attributes>
    </tx:advice>

    <!-- 配置切入点 -->
    <aop:config>
    <aop:advisor advice-ref="txAdvice"
    pointcut="execution (* com.zxh.server.nation*.*(..))" />
    </aop:config>一部分关键的都在这边了
      

  4.   

    你用的是不是同一个connection啊。getSession();怎么写的?
      

  5.   

    你继承 HibernateSupportDao 写DAO的方法就行了
    别自己创建session 和管理session
      

  6.   

    你是用的openSession还是getCurrentSession
      

  7.   

    问题出来了  execution (* com.zxh.server.nation*.*(..)) 这边少了一个“.”
    execution (* com.zxh.server.nation.*.*(..))" 项目搞来搞去吧“.”给搞掉了,郁闷,导致事务部成功每次session都不一样,就果session越开越多,没有关闭,数据库就产生死锁了。
    非常感谢7楼的回复,确实是问题所在,我打印一下 hascode()终于发现每次session都不同。