Spring Boot Hikari多数据库自动装配失败

时间:2016-05-12 09:30:30

标签: multiple-databases

我正在尝试使用Spring Boot Hikari CP实现多个数据库。我正在

   Caused by:    org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: hikari_primary,hikari_secondary

供你参考我附加了我的spring boot数据源配置文件, 请不要超过主要和次要命名​​约定(它们不代表优先级),我要求它有两个不同数据库的连接池。

感谢任何帮助

1.application.properties

spring.datasource.dataSourceClassName=com.microsoft.sqlserver.jdbc.SQLServerDataSource


primary.spring.datasource.url=jdbc:sqlserver://xxx.xxx.xxx.xxx:1433;DatabaseName=training
primary.spring.datasource.username=training
primary.spring.datasource.password=training
primary.spring.datasource.poolName=hikari_primary
primary.spring.datasource.maximumPoolSize=5
primary.spring.datasource.minimumIdle=3
primary.spring.datasource.maxLifetime=2000000
primary.spring.datasource.connectionTimeout=30000
primary.spring.datasource.idleTimeout=30000
primary.spring.datasource.pool-prepared-statements=true
primary.spring.datasource.max-open-prepared-statements=250

secondary.spring.datasource.url=jdbc:sqlserver://xxx.xxx.xxx.xxx:1433;DatabaseName=dev_xxxxx_core_v3
secondary.spring.datasource.username=developer
secondary.spring.datasource.password=Developer
secondary.spring.datasource.poolName=hikari_secondary
secondary.spring.datasource.maximumPoolSize=50
secondary.spring.datasource.minimumIdle=30
secondary.spring.datasource.maxLifetime=2000000
secondary.spring.datasource.connectionTimeout=30000
secondary.spring.datasource.idleTimeout=30000
secondary.spring.datasource.pool-prepared-statements=true
secondary.spring.datasource.max-open-prepared-statements=300

2。 PrimaryDataSourceConfig.java

@Configuration
public class PrimaryDataSourceConfig {

    @Value("${primary.spring.datasource.username}")
    private String user;

    @Value("${primary.spring.datasource.password}")
    private String password;

    @Value("${primary.spring.datasource.url}")
    private String dataSourceUrl;

    @Value("${spring.datasource.dataSourceClassName}")
    private String dataSourceClassName;

    @Value("${primary.spring.datasource.poolName}")
    private String poolName;

    @Value("${primary.spring.datasource.connectionTimeout}")
    private int connectionTimeout;

    @Value("${primary.spring.datasource.maxLifetime}")
    private int maxLifetime;

    @Value("${primary.spring.datasource.maximumPoolSize}")
    private int maximumPoolSize;

    @Value("${primary.spring.datasource.minimumIdle}")
    private int minimumIdle;

    @Value("${primary.spring.datasource.idleTimeout}")
    private int idleTimeout;

    @Bean(name="hikari_primary")
    public HikariDataSource getHikariDataSourcePrimary() {
        Properties dsProps = new Properties();
        dsProps.put("url", dataSourceUrl);
        dsProps.put("user", user);
        dsProps.put("password", password);

        Properties configProps = new Properties();
        configProps.put("dataSourceClassName", dataSourceClassName);
        configProps.put("poolName", poolName);
        configProps.put("maximumPoolSize", maximumPoolSize);
        configProps.put("minimumIdle", minimumIdle);
        configProps.put("minimumIdle", minimumIdle);
        configProps.put("connectionTimeout", connectionTimeout);
        configProps.put("idleTimeout", idleTimeout);
        configProps.put("dataSourceProperties", dsProps);

        HikariConfig hc = new HikariConfig(configProps);
        HikariDataSource ds = new HikariDataSource(hc);
        return ds;
    }
}

第3。 SecondayDataSourceConfig.java

@Configuration
public class SecondaryDataSourceConfig {


    @Value("${secondary.spring.datasource.username}")
    private String user;

    @Value("${secondary.spring.datasource.password}")
    private String password;

    @Value("${secondary.spring.datasource.url}")
    private String dataSourceUrl;

    @Value("${spring.datasource.dataSourceClassName}")
    private String dataSourceClassName;

    @Value("${secondary.spring.datasource.poolName}")
    private String poolName;

    @Value("${secondary.spring.datasource.connectionTimeout}")
    private int connectionTimeout;

    @Value("${secondary.spring.datasource.maxLifetime}")
    private int maxLifetime;

    @Value("${secondary.spring.datasource.maximumPoolSize}")
    private int maximumPoolSize;

    @Value("${secondary.spring.datasource.minimumIdle}")
    private int minimumIdle;

    @Value("${secondary.spring.datasource.idleTimeout}")
    private int idleTimeout;


    @Bean(name="hikari_secondary")
    public HikariDataSource getHikariDataSourceSecondary() {
        Properties dsProps = new Properties();
        dsProps.put("url", dataSourceUrl);
        dsProps.put("user", user);
        dsProps.put("password", password);

        Properties configProps = new Properties();
        configProps.put("dataSourceClassName", dataSourceClassName);
        configProps.put("poolName", poolName);
        configProps.put("maximumPoolSize", maximumPoolSize);
        configProps.put("minimumIdle", minimumIdle);
        configProps.put("minimumIdle", minimumIdle);
        configProps.put("connectionTimeout", connectionTimeout);
        configProps.put("idleTimeout", idleTimeout);
        configProps.put("dataSourceProperties", dsProps);

        HikariConfig hc = new HikariConfig(configProps);
        HikariDataSource ds = new HikariDataSource(hc);
        return ds;
    }
}

4。 Application.java

@SpringBootApplication
@ComponentScan("com.xxxx.springsql2o")
@EnableAutoConfiguration
public class Application 
{
    public static void main( String[] args )
    {
        SpringApplication.run(Application.class, args);

    }

    @Autowired
    @Qualifier("hikari_primary")
    DataSource hikariDataSourcePrimary;

    @Autowired
    @Qualifier("hikari_secondary")
    DataSource hikariDataSourceSecondary;


    @Bean(name= "primary_db")
    public Sql2o getPrimarySql2o()
    {
        return new Sql2o(hikariDataSourcePrimary);
    }

    @Bean(name= "secondary_db")
    public Sql2o getSecondarySql2o()
    {
        return new Sql2o(hikariDataSourceSecondary);
    }
}

1 个答案:

答案 0 :(得分:0)

Spring启动是通过@EnableAutoConfiguration自动配置您的应用程序(请注意,此批注已包含在组合的@SpringBootApplication批注中)。所以我的猜测是你有一些依赖,春天试图自动配置(例如JPA)使用/需要DataSource。如果您可以使用它,则可以将@Primary添加到DataSource Bean提供程序方法中,以满足该依赖性。 所以,例如:

@Bean(name="hikari_primary")
@Primary
public HikariDataSource getHikariDataSourcePrimary() {...

即使这应该有用,也建议删除自动配置,例如: JPA或任何弹簧启动尝试自动配置但您不使用/需要并手动配置所有内容,因为它适合您的应用程序需求。有两个数据库肯定是一个自定义配置,并不符合弹簧启动容易开箱即用的方法。