Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot如何添加可能存在或不存在的第二个数据源_Spring_Jpa_Spring Boot - Fatal编程技术网

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连接池,以便在引导时避免这种情况(如果您愿意),请检查此项,但在您的情况下,我会选择将主数据库指向更可靠的服务器,以跳过此类错误消息。