如何配置事务管理以在春季使用2个不同的数据库?

我有2个数据库(MySql和HSQLDB)。我配置了 2 个数据源和 2 个 EntityManagerFactory Bean。我还可以配置 2 个对应的 JpaTransactionManager bean。

但我不知道如何指定应该使用其中的哪一个来管理具体服务类的事务。我想为此目的使用注释,但我实际上只能指定一个txManagers:@Transactional

<tx:annotation-driven transaction-manager="manager"/>

摆脱这种情况的出路是什么?


答案 1

声明不带事务管理器的属性,为事务管理器声明限定符,如下所示:<tx:annotation-driven>

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <qualifier value="txManager1"/>
</bean>

@Transactional 中将此限定符用作选择其中一个事务管理器的值

@Transactional("txManager1")

或者,具有更多属性:

@Transactional(value = "txManager1", readOnly = true)   

答案 2

JpaTransactionManager 的 javadoc 对此有一些建议:

此事务管理器适用于使用单个 JPA EntityManagerFactory 进行事务数据访问的应用程序。JTA(通常通过 JtaTransactionManager)对于访问同一事务中的多个事务资源是必需的。请注意,您需要相应地配置 JPA 提供程序,以便使其参与 JTA 事务。

换句话说,如果您发现自己有多个实体管理器,以及相应的tx管理器,那么您应该考虑使用单个JtaTransactionManager。实体经理应该能够参与JTA交易,这将使您在两个实体经理之间具有完全的事务性,而无需担心您在任何时候都处于哪个实体经理。

当然,确实需要一个完整的支持JTA的应用程序服务器,而不是像Tomcat这样的普通servlet引擎。JtaTransactionManager


推荐