Spring 多线程在Hibernate中查询。org.hibernate.HibernateException:get在没有活动事务的情况下无效

Spring 多线程在Hibernate中查询。org.hibernate.HibernateException:get在没有活动事务的情况下无效,spring,hibernate,Spring,Hibernate,我有一个正在创建许多线程的应用程序。它们具有要查询的会话的属性(之前已配置) 当我尝试查询时,出现以下异常: org.hibernate.HibernateException:get在没有活动事务的情况下无效 我一直在读那个会话,会话不能在线程之间共享,我想知道解决这个问题的最佳方法。我只能为每个线程打开一个新连接吗 public Configuration get(final String id) { final Session session = sessionF

我有一个正在创建许多线程的应用程序。它们具有要查询的会话的属性(之前已配置)

当我尝试查询时,出现以下异常: org.hibernate.HibernateException:get在没有活动事务的情况下无效

我一直在读那个会话,会话不能在线程之间共享,我想知道解决这个问题的最佳方法。我只能为每个线程打开一个新连接吗

  public Configuration get(final String id) {
            final Session session = sessionFactory.getCurrentSession(); //it works with openSession..
            final Configuration object =
                    (Configuration) session.get(Configuration.class.getName(),
                            id);
            return object;
        }


    <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                    <prop key="hibernate.connection.autocommit">false</prop>
                    <prop key="hibernate.show_sql">false</prop>
                    <!-- <prop key="current_session_context_class">thread</prop>--> 
                    <prop key="hibernate.current_session_context_class">thread</prop>
                    <prop key="hibernate.hbm2ddl.auto">validate</prop>

                    <prop key="hibernate.c3p0.min_size">2</prop>
                    <prop key="hibernate.c3p0.max_size">125</prop>
                    <prop key="hibernate.c3p0.timeout">1800</prop>
                    <prop key="hibernate.c3p0.max_statements">500</prop>
                </props>
            </property>



<bean id="transactionManager"
    class="com.pragsis.bidoop.data.tx.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="txTemplate" abstract="true"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="get*">
                PROPAGATION_SUPPORTS,ISOLATION_READ_UNCOMMITTED,readOnly
            </prop>
            <prop key="list*">
                PROPAGATION_SUPPORTS,ISOLATION_READ_UNCOMMITTED,readOnly
            </prop>
            <prop key="*">
                PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE
            </prop>
        </props>
    </property>
</bean>
公共配置获取(最终字符串id){
final Session Session=sessionFactory.getCurrentSession();//它与openSession一起工作。。
最终配置对象=
(配置)会话.get(配置.class.getName(),
身份证);
返回对象;
}
org.hibernate.dialogue.mysqldialogue
错误的
错误的
线
验证
2.
125
1800
500
传播\支持隔离\读取\未提交、只读
传播\支持隔离\读取\未提交、只读
需要传播,隔离可序列化
我已经标记了我在线程上使用的方法,比如事务、服务,而不是从配置中获取方法,但是,我得到了相同的错误


我使用Spring来管理事务

每个事务都是线程绑定的,因此如果跨越一个新线程,它将无法访问原始线程的事务

最简单的解决方案是从新创建的线程调用@Transactional services:

myService.getSomething();

当调用这样的@Transactional服务方法时,一个新的事务与当前线程相关联,并且由于您使用Spring,因此您的所有DAO都将相应地使用它。

我在run方法中为每个线程再次打开了连接,它起到了作用。虽然我在使用Tomcat6的webv应用程序中执行此操作时没有开始工作。每个新线程在其自己的连接中都有自己的事务。你说得对。