Java 如何使用Spring数据JPA ORM在运行时动态切换数据库

Java 如何使用Spring数据JPA ORM在运行时动态切换数据库,java,spring-boot,spring-data-jpa,datasource,Java,Spring Boot,Spring Data Jpa,Datasource,我想用Java、Spring和Spring JPA创建一个应用程序,在运行时使用多个数据库 实际上,我正在使用以下流程创建多租户应用程序: 1-一个应用程序可能是php:从网站用户将创建帐户,系统将运行该进程,并将创建数据库和各自的配置 2-现在将加载主要应用程序(Java+SpringJPA、SpringREST),开始指向新创建的数据库,其中包含用户和其他内容数据,这些数据可能基于租户Id或其他一些指向标志 进一步计划增加第3点; 3-oAuth2 rest安全性也是如此。因此,应相应地调整

我想用Java、Spring和Spring JPA创建一个应用程序,在运行时使用多个数据库

实际上,我正在使用以下流程创建多租户应用程序:

1-一个应用程序可能是php:从网站用户将创建帐户,系统将运行该进程,并将创建数据库和各自的配置

2-现在将加载主要应用程序(Java+SpringJPA、SpringREST),开始指向新创建的数据库,其中包含用户和其他内容数据,这些数据可能基于租户Id或其他一些指向标志

进一步计划增加第3点; 3-oAuth2 rest安全性也是如此。因此,应相应地调整配置


现在的问题是,如何在Spring Data JPA应用程序中实现这一点,并在运行时切换数据库配置?

您可以在Spring中预先配置多个数据源,并在不同的包结构中隔离关联的存储库(不是真正的交换机,而是从同一Spring boot应用程序访问多个数据源)

创建一个新配置以扫描隔离包中的repo,并加载配置属性以构建第二个数据源

@EnableJpaRepositories(
  basePackages = { "<package containing repo from second database>" }
)
public class SecondDBConfig {
@Bean(name = "secondDataSource")
  @ConfigurationProperties(prefix = "second.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }
@EnableJpaRepositories(
basePackages={'}
)
公共类SecondDBConfig{
@Bean(name=“secondDataSource”)
@ConfigurationProperties(前缀=“second.datasource”)
公共数据源数据源(){
返回DataSourceBuilder.create().build();
}
…创建事务管理器和实体管理工厂

最后,访问连接到不同数据库的存储库


请参阅完整示例

您是否也要编写示例?如果可用,那就太好了。@AnishB。这并不是我问题的答案,根据您的回答,我们必须在初始化应用程序之前进行预定义配置,这已经够可怕的了。但在我的情况下,我有动态数据库及其属性,因此我必须在r上连接您的意思是,当您启动应用程序时,要查询的数据库是未知的?如果是,它是在什么时候被知道的,以及谁提供了这些信息(连接详细信息)如何实现?也许可以动态实例化应用程序的数据源?在loggedin屏幕上,系统将要求用户输入tenantId,该ID将被引用到数据库。因此,在loggedin之后,每个请求都将连接到该数据库。在应用程序初始化时,它将连接到包含te信息的集中式数据库我已经用JDBC模板实现了这个流程,但是这是一个新的项目,现在我必须处理现有的,所以我想用最少的更改来实现。
@EnableJpaRepositories(
  basePackages = { "<package containing repo from second database>" }
)
public class SecondDBConfig {
@Bean(name = "secondDataSource")
  @ConfigurationProperties(prefix = "second.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }