【问题标题】:No Hibernate session bound to the thread while using multiple transation managers使用多个事务管理器时没有绑定到线程的休眠会话
【发布时间】:2012-02-03 10:43:51
【问题描述】:

我创建了两个事务管理器(一个用于 READ 请求,另一个用于 READ-WRITE 请求)和两个会话工厂。

重要的sn-ps如下:

<tx:annotation-driven />

<bean id="txManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>

<bean id="txManagerRead"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory" />
    <qualifier value="READ"/>
</bean>

<bean id="txManagerWrite"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory1" />
     <qualifier value="WRITE"/>
</bean>

<bean id="AbstractSessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    abstract="true">
    <property name="annotatedClasses">
        <list>
.....
....
        </list>
    </property>
    <property name="exposeTransactionAwareSessionFactory">
        <value>true</value>
    </property>
</bean>

<bean id="SessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    parent="AbstractSessionFactory">
    <property name="hibernateProperties">
        <props>
.........
.........
</props>
</property>
</bean>



<bean id="SessionFactory1"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    parent="AbstractSessionFactory">
    <property name="hibernateProperties">
        <props>
.........
.........
</props>
</property>
</bean>

我收到以下异常:

Caused by: org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)

    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574)

    at com.amazon.im.dao.hibernate.GenericDAOImpl.getSession(GenericDAOImpl.java:53)

    at com.amazon.im.dao.hibernate.CategoryDAOImpl.findAllActiveCategories(CategoryDAOImpl.java:54)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

调用DAO的方法如下:

 @Transactional(rollbackFor = { DependencyException.class, ServiceException.class }, readOnly = true, value="READ")
@Operation("getActiveCategories")
public GetActiveCategoriesResponse getActiveCategories() throws ServiceException, DependencyException
{ .....
......
......
}

谁能指出我做错的部分?

【问题讨论】:

  • 我完全看不出这样做的意义?为什么有 2 个(甚至 3 个)不同的 TM?如果一个读写方法想调用一个读方法会发生什么?
  • @JB:到目前为止,假设 read-write 方法只会调用 write 方法。拥有 2 个 TM(第 3 个是默认值)的原因是每个 API 都存在事务注释,该注释在开始时创建一个会话,用于后续 DAO 调用。
  • 我明白这一点。但是,除了不必要的复杂性之外,您从 1 个用于所有操作的单个 TM 中获得了什么?标准的做法是拥有一个 TM。不需要几个。
  • 我们不想使用这里解释的 ThreadLocal 变量 - blog.springsource.org/2007/01/23/dynamic-datasource-routing。有没有更好的办法?
  • @tyro 我在我的应用程序中使用 CustomRoutingDataSource ,我不喜欢使用 ThreadLocal 变量并每次都设置 CustomRoutingDataSource ,因此我将其设为会话 bean 。除此之外,您还可以进行程序化 Txn 管理。

标签: java hibernate spring sessionfactory transactionmanager


【解决方案1】:

尝试按照this 使用@Transactional("Tx_Manager_Name")。您的配置似乎是正确的,因为通过 Qualifiers 也支持多个 Txn 管理器。

【讨论】:

  • 谢谢阿拉文德。但是,我认为这段代码完全按照你说的做。 @Transactional(rollbackFor = { DependencyException.class, ServiceException.class }, readOnly = true, value="READ")。让我知道是否有任何区别。 “READ”是 TX_MANAGER 的名称。
  • @tyro - 我复制了您的整个配置,但没有发现任何问题。我怀疑可能是 Dao 层的问题——会话工厂的注入什么的。或者您可能正在事务之外执行查找。
  • 是的。我犯了一个错误:( 被评论了。非常感谢你的帮助:)
【解决方案2】:

您的配置错误。 Hibernate 甚至 Spring 允许您为每个应用程序仅创建一个会话工厂。查看此链接:Spring + Hibernate session lifecycle。您可以为每个事务创建会话。

也请查看此链接:http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html

【讨论】:

  • org.hibernate.HibernateException:没有 Hibernate Session 绑定到线程,并且配置不允许在这里创建非事务性会话(sessionfactory)
  • 不确定这是否正确。我已经构建了几个使用多个会话工厂的应用程序,每个 dataSource 一个。当然,在底层,Hibernate 可能会重用相同的 SessionFactory 来创建新会话(就像 EhCache 对 CacheManager 和缓存所做的那样)。
  • 是的!可以。如果您使用多个数据源,则可以为每个数据源创建会话工厂。但是@tyro 对两个(读取和写入)会话工厂使用单个数据源,这是不可能的。
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多