Spring Boot如何添加可能存在或可能不存在的第二个数据源

use*_*959 2 spring jpa spring-boot

我希望为我的应用程序提供一个可选的辅助数据库,这样,如果辅助数据库存在于部署的环境中,存储库可以从中检索数据,但如果它不存在,应用程序仍然可以仅使用主数据库正常工作,并且存储库将以应用程序可以知道该数据源不可用的方式运行。

我绝对可以想到完成此类事情的方法,但我想知道是否有更直接的配置类型方法来实现此目的。或者如果有一种模式类型的处理方式是更好的。

Pau*_*mes 5

您当然可以通过简单的方式使用多个数据库,只需实现 2 个数据库配置并使用 @Primary 注释来注释其中一个即可。

@Bean(name = "mainDataSource")
@Primary
public DataSource mainDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}
Run Code Online (Sandbox Code Playgroud)

对于辅助数据库,您可以创建几乎相同的内容,但不要在其上添加 @Primary 注释。

@Bean(name = "secondaryDataSource") 
public DataSource secondaryDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要仅将 @Primary 注释放在 DataSource bean 上,而是可以放在用于连接数据库的任何 bean 中。

完成此操作后,您所要做的就是注释您的 EntityManager 或您通常使用 @Qualifier 的任何其他连接管理器。

@Autowired
@Qualifier("mainEntityManager")
private EntityManager mainDatabase;

@Autowired
@Qualifier("secondEntityManager")
private EntityManager secondDatabase;
Run Code Online (Sandbox Code Playgroud)

就我而言,我更喜欢创建一个类来在后台管理这个问题。您可以在我的 linkedin 文章中找到完整的示例。并查看GitHub 上的示例代码