Spring boot如何添加可能存在或不存在的第二个数据源
我希望为我的应用程序提供一个可选的辅助数据库,这样,如果辅助数据库存在于已部署的环境中,存储库可以从中检索数据,但如果它不存在,应用程序仍然可以仅使用主数据库正常工作,存储库的行为方式会使应用程序知道此数据源不可用Spring boot如何添加可能存在或不存在的第二个数据源,spring,jpa,spring-boot,Spring,Jpa,Spring Boot,我希望为我的应用程序提供一个可选的辅助数据库,这样,如果辅助数据库存在于已部署的环境中,存储库可以从中检索数据,但如果它不存在,应用程序仍然可以仅使用主数据库正常工作,存储库的行为方式会使应用程序知道此数据源不可用 我肯定能想到实现这类事情的方法,但我想知道是否有更直接的配置类型的方法来实现这一点。或者,如果有一种更可取的模式类型处理方式 只需实现2个数据库配置并使用@Primary annotation注释其中一个数据库,就可以以干净的方式处理多个数据库 @Bean(name = "mainD
我肯定能想到实现这类事情的方法,但我想知道是否有更直接的配置类型的方法来实现这一点。或者,如果有一种更可取的模式类型处理方式 只需实现2个数据库配置并使用@Primary annotation注释其中一个数据库,就可以以干净的方式处理多个数据库
@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;
}
对于辅助数据库,您可以创建几乎相同的数据库,但不要在其上添加@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;
}
请注意,您不需要将@Primary注释仅放在数据源bean上,而是放在用于连接数据库的任何bean中
完成此操作后,您所要做的就是注释EntityManager或通常与@Qualifier一起使用的任何其他连接管理器
@Autowired
@Qualifier("mainEntityManager")
private EntityManager mainDatabase;
@Autowired
@Qualifier("secondEntityManager")
private EntityManager secondDatabase;
在我的情况下,我更喜欢在后台制作一个类来处理这个问题。
您可以在上找到这方面的完整示例并查看您当然可以以干净的方式使用多个数据库,只需实现2个数据库配置并使用@Primary annotation注释其中一个数据库即可
@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;
}
对于辅助数据库,您可以创建几乎相同的数据库,但不要在其上添加@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;
}
请注意,您不需要将@Primary注释仅放在数据源bean上,而是放在用于连接数据库的任何bean中
完成此操作后,您所要做的就是注释EntityManager或通常与@Qualifier一起使用的任何其他连接管理器
@Autowired
@Qualifier("mainEntityManager")
private EntityManager mainDatabase;
@Autowired
@Qualifier("secondEntityManager")
private EntityManager secondDatabase;
在我的情况下,我更喜欢在后台制作一个类来处理这个问题。
您可以在上找到这方面的完整示例,并查看谢谢您的回答。我将如何处理第二个数据库不存在的情况?弹簧还能正常工作吗?我是否有办法通过编程来处理这种情况?即使您的应用程序在引导过程中无法连接到数据库,应用程序也会按预期启动。之后,您可以处理检查,如果第二个检查失败,您可以更改为第一个检查。您也可以尝试手动更改JDBC连接池,以避免在启动时出现这种情况(如果您愿意),请检查此项,但在您的情况下,我会选择将主数据库指向更可靠的服务器,以跳过此类错误消息。谢谢您的回答。我将如何处理第二个数据库不存在的情况?弹簧还能正常工作吗?我是否有办法通过编程来处理这种情况?即使您的应用程序在引导过程中无法连接到数据库,应用程序也会按预期启动。之后,您可以处理检查,如果第二个检查失败,您可以更改为第一个检查。您也可以尝试手动更改JDBC连接池,以便在引导时避免这种情况(如果您愿意),请检查此项,但在您的情况下,我会选择将主数据库指向更可靠的服务器,以跳过此类错误消息。