【问题标题】:Spring Boot only initializes one data source but not the otherSpring Boot 只初始化一个数据源,而不初始化另一个
【发布时间】:2021-12-03 05:45:36
【问题描述】:

我关注了多篇关于创建多个数据源的文章,并在我的代码中尝试了相同的方法。但奇怪的是,spring boot 只初始化一个数据源而不是另一个。当我从代码中删除其中任何一个时,另一个创建时没有任何问题。任何想法。

Bean 配置 -

@Configuration
public class DBConfiguration {

    @Bean("dataSource")
    @ConfigurationProperties(prefix = "p.datasource")
    public DataSource pDataSource() {
        System.out.println("**************************> dataSource");
        return DataSourceBuilder.create().build();
    }

    @Bean("storeFrontDataSource")
    @ConfigurationProperties(prefix = "c.datasource")
    public DataSource cDataSource() {
        System.out.println("**************************> storeFrontDataSource");
        return DataSourceBuilder.create().build();
    }
}

YML 文件(出于保密考虑删除了一些数据)-

p:
  datasource:
    url: {some-url}
    driver-class-name: com.ibm.db2.jcc.DB2Driver
    username: abc
    password: xyz
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      schema:        
      connection-init-sql: select 1 from dual
      minimum-idle: 25
      maximum-pool-size: 100 
      idle-timeout: 10_000
      max-lifetime: 20_000
      connection-timeout: 1_000
      validation-timeout: 500

c:
  datasource:
    url: {some-url}
    driver-class-name: com.ibm.db2.jcc.DB2Driver
    username: abc
    password: xyz
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      schema:        
      pool-name: uspo-cis-sf-pool
      connection-init-sql: select 1 from dual
      minimum-idle: 1
      maximum-pool-size: 5 
      idle-timeout: 10_000
      max-lifetime: 50_000
      connection-timeout: 2_000 
      validation-timeout: 500

抛出错误 -

只找到“datasource”bean,而不是“storeFrontDataSource”bean。即使在控制台上,也只有一个 System.out.println() 被调用(即“数据源”),而另一个则不被打印。 SpringBoot 甚至没有初始化其他 bean 定义。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.zaxxer.hikari.HikariDataSource' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=storeFrontDataSource)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790) ~[spring-beans-5.3.3.jar:5.3.3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346) ~[spring-beans-5.3.3.jar:5.3.3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.3.jar:5.3.3]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.3.jar:5.3.3]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.3.jar:5.3.3]
    ... 38 common frames omitted

注意 - 即使定义 @Primary 也无济于事。无论如何,System.out.println() 都应该打印到控制台。

【问题讨论】:

  • 在注入 bean 的站点,尝试注入 DataSource 而不是 HikariDataSource,也许 HikariDataSource 正在被包装。
  • 我正在使用 bean 限定符注入数据源。如果我将@Primary 放在“storeFrontDataSource”上,那么它就会被创建,并且我们会因为找不到“dataSource”bean 而出现错误。无论用法如何,都必须调用 System.out.println(),这很奇怪。
  • 你在 @Autowired 的地方声明的类型是什么?
  • 请将注入数据源的代码添加到您的问题中
  • 今天睡了个好觉后,我重新扫描了代码,发现这两个数据源的用户在依赖库中,他们正在为两个数据源注入 HikariDataSource。我会修复它,看看它是否能解决问题,但为什么它适用于一个数据源而不适用于其他数据源?

标签: java spring-boot datasource multiple-databases


【解决方案1】:

您需要创建客户配置类以创建多个数据源并定义主数据源。

baeldung查看这个例子

【讨论】:

  • 当同一篇文章说可以使用自动配置时,我为什么要进行自定义配置?
【解决方案2】:

根据@tgdavies 的建议,我发现依赖库中的一些类正在注入“HikariDataSource”而不是“DataSource”。修复后问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2017-09-21
    • 2016-12-16
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多