Spring 启动应用程序不会连接到第二个数据源
Spring Boot application will not connect to the second datasource
我有一个使用 2 个数据源的 Spring 启动应用程序。它可以很好地连接到第一个。当我尝试使用第二个数据源时,出现 SQL 错误:Table 或视图不存在,因为它使用第一个数据源作为其连接。
这是我的应用程序 属性 文件:
#Property for both DBs
spring.datasource.driver.class.name=oracle.jdbc.driver.OracleDriver
## Database Properties DB #1
spring.datasource.tms.url=jdbc:oracle:thin:@ldap:<connection properties have been removed but are present>
spring.datasource.tms.username=own_app
spring.datasource.tms.password=own_app_l1
spring.datasource.tms.jmx.enabled=true
spring.main.allow-bean-definition-overriding=true
## Database Properties DB #2
spring.datasource.lhl.url=jdbc:oracle:thin:@ldap:<connection string has been removed but is correct>
spring.datasource.lhl.username=LHL_PURCH_APP
spring.datasource.lhl.password=ChangemeChangemeChangeme$19
spring.datasource.lhl.jmx-enabled=true
这是我的两个数据源的配置文件:
@Configuration
@PropertySource("classpath:application-local.properties")
public class FxgLhlPurchasedItineraryAdapterDataSourceConfiguration {
@Value("${spring.datasource.driver.class.name}")
private String driverClassName;
//TMS properties
@Value("${spring.datasource.tms.url}")
private String tmsUrl;
@Value("${spring.datasource.tms.username}")
private String tmsUsername;
@Value("${spring.datasource.tms.password}")
private String tmsPassword;
//LHL Properties
@Value("${spring.datasource.lhl.url}")
private String lhlUrl;
@Value("${spring.datasource.lhl.username}")
private String lhlUsername;
@Value("${spring.datasource.lhl.password}")
private String lhlPassword;
@Primary
@Bean(name = "tmsDataSource")
@ConfigurationProperties(prefix = "spring.datasource.tms")
public DataSource tmsDataSource() {
DataSourceBuilder factory = DataSourceBuilder.create(this.getClass().getClassLoader())
.driverClassName(driverClassName).url(tmsUrl)
.username(tmsUsername)
.password(tmsPassword);
return factory.build();
}
@Bean(name = "lhlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.lhl")
public DataSource lhlDataSource() {
DataSourceBuilder factory = DataSourceBuilder.create(this.getClass().getClassLoader())
.driverClassName(driverClassName).url(lhlUrl)
.username(lhlUsername)
.password(lhlPassword);
return factory.build();
}
@Bean(name = "tmsJdbcTemplate")
public JdbcTemplate tmsJdbcTemplate(final DataSource tmsDataSource) {
return new JdbcTemplate(tmsDataSource);
}
@Bean(name = "lhlJdbcTemplate")
public JdbcTemplate lhlJdbcTemplate(final DataSource lhlDataSource) {
return new JdbcTemplate(lhlDataSource);
}
}
如果服务不可用,我必须添加 @Primary
注释 运行。
当我尝试对不是主数据库的 table 执行简单的 SELECT 时,我收到 table 不存在的错误。
这是调用 select 语句的代码:
private JdbcTemplate lhlJdbcTemplate;
DataSource ds = lhlJdbcTemplate.getDataSource();
Connection con = ds.getConnection();
LOGGER.info("Connection info: {}", con.getSchema());
lhlParmSqIdModelList = lhlJdbcTemplate.query(
selectSequenceNbrSQLStatement,
new LhlParmSqIdModelRowMapper());
记录器语句 returns 主数据库的架构。
如何获得使用第二个数据库的连接
因为你有多个 DataSource
beans,通常 Spring 会失败,因为它不知道如何自动决定它应该使用多个等效 beans 中的哪一个,它把这个责任推给了你程序员。
通过添加 @Primary
注释,您告诉 Spring "If there are multiple candidate beans of this type, use this one."
您的 bean 方法不会向 Spring 询问特定的 DataSource
,它们只需要 any 数据源,因此 Spring 给出每个其中标有 @Primary
.
的那个
相反,您需要使用 @Qualifier
来准确指明他们想要的名字 DataSource
:
@Bean(name = "tmsJdbcTemplate")
public JdbcTemplate tmsJdbcTemplate(@Qualifier("tmsDataSource") final DataSource tmsDataSource) {
return new JdbcTemplate(tmsDataSource);
}
@Bean(name = "lhlJdbcTemplate")
public JdbcTemplate lhlJdbcTemplate(@Qualifier("lhlDataSource") final DataSource lhlDataSource) {
return new JdbcTemplate(lhlDataSource);
}
我不保证此语法完全正确,但大致如此。
您还需要限定 JdbcTemplate 注入点。 (在评论中归功于 Sherif Behna)
我有一个使用 2 个数据源的 Spring 启动应用程序。它可以很好地连接到第一个。当我尝试使用第二个数据源时,出现 SQL 错误:Table 或视图不存在,因为它使用第一个数据源作为其连接。
这是我的应用程序 属性 文件:
#Property for both DBs
spring.datasource.driver.class.name=oracle.jdbc.driver.OracleDriver
## Database Properties DB #1
spring.datasource.tms.url=jdbc:oracle:thin:@ldap:<connection properties have been removed but are present>
spring.datasource.tms.username=own_app
spring.datasource.tms.password=own_app_l1
spring.datasource.tms.jmx.enabled=true
spring.main.allow-bean-definition-overriding=true
## Database Properties DB #2
spring.datasource.lhl.url=jdbc:oracle:thin:@ldap:<connection string has been removed but is correct>
spring.datasource.lhl.username=LHL_PURCH_APP
spring.datasource.lhl.password=ChangemeChangemeChangeme$19
spring.datasource.lhl.jmx-enabled=true
这是我的两个数据源的配置文件:
@Configuration
@PropertySource("classpath:application-local.properties")
public class FxgLhlPurchasedItineraryAdapterDataSourceConfiguration {
@Value("${spring.datasource.driver.class.name}")
private String driverClassName;
//TMS properties
@Value("${spring.datasource.tms.url}")
private String tmsUrl;
@Value("${spring.datasource.tms.username}")
private String tmsUsername;
@Value("${spring.datasource.tms.password}")
private String tmsPassword;
//LHL Properties
@Value("${spring.datasource.lhl.url}")
private String lhlUrl;
@Value("${spring.datasource.lhl.username}")
private String lhlUsername;
@Value("${spring.datasource.lhl.password}")
private String lhlPassword;
@Primary
@Bean(name = "tmsDataSource")
@ConfigurationProperties(prefix = "spring.datasource.tms")
public DataSource tmsDataSource() {
DataSourceBuilder factory = DataSourceBuilder.create(this.getClass().getClassLoader())
.driverClassName(driverClassName).url(tmsUrl)
.username(tmsUsername)
.password(tmsPassword);
return factory.build();
}
@Bean(name = "lhlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.lhl")
public DataSource lhlDataSource() {
DataSourceBuilder factory = DataSourceBuilder.create(this.getClass().getClassLoader())
.driverClassName(driverClassName).url(lhlUrl)
.username(lhlUsername)
.password(lhlPassword);
return factory.build();
}
@Bean(name = "tmsJdbcTemplate")
public JdbcTemplate tmsJdbcTemplate(final DataSource tmsDataSource) {
return new JdbcTemplate(tmsDataSource);
}
@Bean(name = "lhlJdbcTemplate")
public JdbcTemplate lhlJdbcTemplate(final DataSource lhlDataSource) {
return new JdbcTemplate(lhlDataSource);
}
}
如果服务不可用,我必须添加 @Primary
注释 运行。
当我尝试对不是主数据库的 table 执行简单的 SELECT 时,我收到 table 不存在的错误。
这是调用 select 语句的代码:
private JdbcTemplate lhlJdbcTemplate;
DataSource ds = lhlJdbcTemplate.getDataSource();
Connection con = ds.getConnection();
LOGGER.info("Connection info: {}", con.getSchema());
lhlParmSqIdModelList = lhlJdbcTemplate.query(
selectSequenceNbrSQLStatement,
new LhlParmSqIdModelRowMapper());
记录器语句 returns 主数据库的架构。 如何获得使用第二个数据库的连接
因为你有多个 DataSource
beans,通常 Spring 会失败,因为它不知道如何自动决定它应该使用多个等效 beans 中的哪一个,它把这个责任推给了你程序员。
通过添加 @Primary
注释,您告诉 Spring "If there are multiple candidate beans of this type, use this one."
您的 bean 方法不会向 Spring 询问特定的 DataSource
,它们只需要 any 数据源,因此 Spring 给出每个其中标有 @Primary
.
相反,您需要使用 @Qualifier
来准确指明他们想要的名字 DataSource
:
@Bean(name = "tmsJdbcTemplate")
public JdbcTemplate tmsJdbcTemplate(@Qualifier("tmsDataSource") final DataSource tmsDataSource) {
return new JdbcTemplate(tmsDataSource);
}
@Bean(name = "lhlJdbcTemplate")
public JdbcTemplate lhlJdbcTemplate(@Qualifier("lhlDataSource") final DataSource lhlDataSource) {
return new JdbcTemplate(lhlDataSource);
}
我不保证此语法完全正确,但大致如此。
您还需要限定 JdbcTemplate 注入点。 (在评论中归功于 Sherif Behna)