我有一个使用两个不同数据源的Grails 3.1.5应用程序。我的目的是在这两个数据源之间使用两阶段提交/ XA事务。我在application.yml中将它们声明为:
dataSources:
dataSource:
dialect: "org.hibernate.dialect.Oracle10gDialect"
jmxExport: false
jndiName: "java:/applicationUserDS"
other:
dialect: "org.hibernate.dialect.Oracle10gDialect"
jmxExport: false
jndiName: "java:/otherUserDS"
name: "other"
但是,当我在JBoss EAP 6中运行应用程序时,我注意到Spring正在尝试使用ChainedTransactionManager,因为有多个事务管理器bean:ChainedTransactionManagerPostProcessor.getTransactionManagerBeanNames(registry)
返回[transactionManager, transactionManager_other]
。
有没有办法配置grails / spring引导,以便它只创建一个事务管理器并将它用于两个数据源?
答案 0 :(得分:1)
您可以通过在transactionManager
grails-app/conf/spring/resources.groovy
bean来覆盖使用的事务管理器
您需要在配置中配置org.springframework.transaction.jta.JtaTransactionManager
并将hibernate.transaction.jta.platform
设置为org.hibernate.engine.transaction.jta.platform.internal.JBossAppServerJtaPlatform
。
您可能还需要将hibernate.current_session_context_class
设置为org.springframework.orm.hibernate5.SpringJtaSessionContext