我正在尝试使用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);
}
}
答案 0 :(得分:0)
Spring启动是通过@EnableAutoConfiguration自动配置您的应用程序(请注意,此批注已包含在组合的@SpringBootApplication批注中)。所以我的猜测是你有一些依赖,春天试图自动配置(例如JPA)使用/需要DataSource。如果您可以使用它,则可以将@Primary添加到DataSource Bean提供程序方法中,以满足该依赖性。 所以,例如:
@Bean(name="hikari_primary")
@Primary
public HikariDataSource getHikariDataSourcePrimary() {...
即使这应该有用,也建议删除自动配置,例如: JPA或任何弹簧启动尝试自动配置但您不使用/需要并手动配置所有内容,因为它适合您的应用程序需求。有两个数据库肯定是一个自定义配置,并不符合弹簧启动容易开箱即用的方法。