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