Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置事务管理以在Spring中使用2个不同的db?_Java_Spring_Jpa_Transactions_Multiple Databases - Fatal编程技术网

Java 如何配置事务管理以在Spring中使用2个不同的db?

Java 如何配置事务管理以在Spring中使用2个不同的db?,java,spring,jpa,transactions,multiple-databases,Java,Spring,Jpa,Transactions,Multiple Databases,我有两个数据库(MySql和HSQLDB)。我配置了2个数据源和2个EntityManagerFactorybean。我还可以配置2个对应的JpaTransactionManager bean 但我不知道如何指定它们中的哪一个应该用于管理具体服务类的事务。我想为此使用@Transactional注释,但实际上我只能指定一个TXManager: <tx:annotation-driven transaction-manager="manager"/> 摆脱这种情况的方法是什么?声

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

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

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

摆脱这种情况的方法是什么?

声明您的
如果没有事务管理器属性,请声明事务管理器的限定符,如下所示:

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <qualifier value="txManager1"/>
</bean>
或者,对于更多属性:

@Transactional(value = "txManager1", readOnly = true)   
政府对此有一些建议:

此事务管理器是 适用于使用 一个JPA EntityManagerFactory用于 事务数据访问。JTA (通常通过 JtaTransactionManager)是必需的 用于访问多个事务 同一事务中的资源。 请注意,您需要配置 JPA提供商相应地 让它参与JTA 交易

换句话说,如果你发现你有多个实体管理者,有相应的TX管理者,那么你应该考虑使用一个单一的替代。实体经理应该能够参与JTA交易,这将为您提供两个实体经理之间的完整交易性,而无需担心您在任何时候都是哪个实体经理


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

您必须在application-context.xml中为此指定两个事务管理器,如下所示:

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


@事务属性现在将使用其相关的事务管理器。

因为它在经过很长一段时间后才得到正确的答案

就JpaTransactionManager对多个数据库的可用性而言,Skaffman可能是正确的

但是有一个工作解决方案可以使用两个不同的数据库和两个不同的JpaTransactionManager

  @Bean(name = "db2TransactionManager")
  public PlatformTransactionManager transactionManager2() throws NamingException {
    JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
    return txManager;
  }

  @Bean
  @Primary
  public PlatformTransactionManager transactionManager() throws Exception {
     JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
    txManager.setNestedTransactionAllowed(true);
    return txManager;
  }

应该使用
@Primary
来指定那些在
@Transactional

中没有指定限定符名称的项目,我可能不懂一些东西,但我认为在Spring中使用的事务管理器,基于数据库事务管理器,即我们应创建尽可能多的tx管理器,以使用尽可能多的不同数据库。错了吗?没那么简单。SpringTX管理器只是其他现有机制(如JTA、JPA/Hibernate或JDBC事务)的包装器。JTA不绑定到一个数据库,它是一个分布式多数据库tx管理器。使用Spring并不能真正改变底层机制的使用方式,它只是让它变得更容易。谢谢,这听起来有点出乎意料,我将在Sun文档中查找它。如果我用2@Transactional()注释一个方法,比如:@Transactional(transactionManager=“customerTransactionManager”),@Transactional,会发生什么(transactionManager=“orderTransactionManager”)?我想知道如何在一个方法中处理两个db transactional。此解决方案有效。但是,如果您在@transactional注释上有限定符,则必须指定一个配置了限定符元素的事务管理器。起初我认为默认事务管理器会接管,但我不是这样。它抱怨我没有在我的事务管理器bean上配置合适的限定符。请注意,这适用于Spring 3以后的版本。这对我来说很有效,我不必在txManager bean或@Transactional注释中指定限定符。我还能够访问两个不同的会话工厂。是的,我也是。我也是不必为@Transactional annotation指定限定符。有趣的是,如果我看一下处理
tx:annotation-driven
annotationdrivenbendefinitionparser
,所有操作只在每个上下文中执行一次!因此第二行完全没有用。这对我来说很有效!很遗憾,Spring官方文档没有提到这一点设置多个数据源TransactionManager的技巧。
  @Bean(name = "db2TransactionManager")
  public PlatformTransactionManager transactionManager2() throws NamingException {
    JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
    return txManager;
  }

  @Bean
  @Primary
  public PlatformTransactionManager transactionManager() throws Exception {
     JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
    txManager.setNestedTransactionAllowed(true);
    return txManager;
  }