【发布时间】:2019-12-16 10:41:28
【问题描述】:
我有一个使用 2 个数据源的 Spring Boot 应用程序。它可以很好地连接到第一个。当我尝试使用第二个数据源时,我收到 SQL 错误:表或视图不存在,因为它使用第一个数据源作为其连接。
这是我的应用程序属性文件:
#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$$2019
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 注释。
当我尝试对不是主数据库的表执行简单的 SELECT 时,我收到该表不存在的错误。
这是调用select语句的代码:
private JdbcTemplate lhlJdbcTemplate;
DataSource ds = lhlJdbcTemplate.getDataSource();
Connection con = ds.getConnection();
LOGGER.info("Connection info: {}", con.getSchema());
lhlParmSqIdModelList = lhlJdbcTemplate.query(
selectSequenceNbrSQLStatement,
new LhlParmSqIdModelRowMapper());
logger 语句返回主数据库的架构。 如何获得连接以使用第二个数据库
【问题讨论】:
-
默认情况下,应用程序将只连接一个数据库。您必须手动配置才能拥有多个数据库连接。
-
你能在声明 lhlJdbcTemplate 的地方添加代码吗?在 lhlJdbcTemplate.query 中使用?
-
添加了 jdbcTemplate 的声明。只是
private JdbcTemplate lhlJdbcTemplate;
标签: java spring-boot jdbctemplate