【问题标题】:Spring TransactionManagement with Atomikos使用 Atomikos 的 Spring 事务管理
【发布时间】:2020-11-23 20:16:16
【问题描述】:

我正在尝试使用 Atomikos maven 依赖项启动 Spring 应用程序

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

我也自动装配如下

 @Autowired
    JtaTransactionManager jtaTransactionManager;

application.yaml 文件如下

spring:
  mvc:
    throw-exception-if-no-handler-found: true
    resources:
      add-mappings: false
  jta:
    atomikos:
      connectionfactory:
        ignore-session-transacted-flag: false
        unique-resource-name: xa.amq
        min-pool-size: 10
        max-pool-size: 20
      datasource:
        unique-resource-name: xa.db
        min-pool-size: 10
        max-pool-size: 20
        test-query: "select 1"
      properties:
        default-jta-timeout: 50000
  datasource:
    url: jdbc:mysql://mydatabasehost:3306/test
    driverClassName: com.mysql.jdbc.Driver
    username: test
    password: test
    initialization-mode: always

上面的 yaml 配置可以正常启动。

但是,对于我的用例,我希望我的事务管理器跳过使用默认的 spring 数据源,而是希望在启动后动态注册数据源 bean。我想知道这是否可能。如果我从上面的 yaml 文件中删除我的数据源设置,我会收到以下错误

15:15:19.322 [main] WARN  com.atomikos.jdbc.AtomikosXAConnectionFactory - XAConnectionFactory: failed to create pooled connection - DBMS down or unreachable?
java.sql.SQLException: Database not available
    at org.apache.derby.jdbc.BasicEmbeddedDataSource40.setupResourceAdapter(Unknown Source)
    at org.apache.derby.jdbc.EmbeddedXADataSource.getXAConnection(Unknown Source)
    at com.atomikos.jdbc.AtomikosXAConnectionFactory.createPooledConnection(AtomikosXAConnectionFactory.java:28)
    at com.atomikos.datasource.pool.ConnectionPool.createPooledConnection(ConnectionPool.java:98)
    at com.atomikos.datasource.pool.ConnectionPool.addConnectionsIfMinPoolSizeNotReached(ConnectionPool.java:86)
    at com.atomikos.datasource.pool.ConnectionPool.init(ConnectionPool.java:60)
    at com.atomikos.datasource.pool.ConnectionPool.<init>(ConnectionPool.java:49)
    at com.atomikos.datasource.pool.ConnectionPoolWithConcurrentValidation.<init>(ConnectionPoolWithConcurrentValidation.java:23)
    at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:294)
    at org.springframework.boot.jta.atomikos.AtomikosDataSourceBean.afterPropertiesSet(AtomikosDataSourceBean.java:49)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:307)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)

【问题讨论】:

    标签: spring spring-boot datasource spring-transactions atomikos


    【解决方案1】:

    这不是 Atomikos 的限制,因为它允许动态添加数据源。

    看起来 Spring Boot 的约定优于配置试图创建一个默认数据源,如果你没有的话。我不是 Spring Boot 专家,所以我不确定这是否可以被抑制。但是,如果有帮助,在您的配置中使用虚拟默认数据源可能没有什么害处。

    最好的问候

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2012-06-18
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多