Spring 数据 JPA |动态运行时多数据库连接

Spring Data JPA | Dynamic runtime multiple database connection

用例:

在 JBoss 服务器启动期间,已经使用 Spring Data JPA 配置(基于 xml 的方法)建立了一个永久数据库连接。

现在当应用程序已经启动并且 运行ning 时,要求连接到多个数据库并且连接字符串是动态的,这在 运行-time 可用。

如何使用 Spring 数据 JPA 实现此目的?

切换数据源的一种方法是定义一个配置有 "runtime" 数据源的 "runtime" 存储库。但这将使客户端代码知道不同的存储库:

package com...runtime.repository;

public interface RuntimeRepo extends JpaRepository<OBJECT, ID> { ... }

@Configuration
@EnableJpaRepositories(
    transactionManagerRef="runtimeTransactionManager", 
    entityManagerFactoryRef="runtimeEmfBean")
@EnableTransactionManagement
public class RuntimeDatabaseConfig {

    @Bean public DataSource runtimeDataSource() {
        DriverManagerDataSource rds = new DriverManagerDataSource();
        // setup driver, username, password, url
        return rds;
    }

    @Bean public LocalContainerEntityManagerFactoryBean runtimeEmfBean() {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(runtimeDataSource());
        // setup JpaVendorAdapter, jpaProperties, 
        return factoryBean;
    }

    @Bean public PlatformTransactionManager runtimeTransactionManager() {
        JpaTransactionManager jtm = new JpaTransactionManager();
        jtm.setEntityManagerFactory(runtimeEmfBean());
        return jtm;
    }
}

我已经合并代码保存space;您将在不同的文件中定义 javaconfig 和 repo 接口,但在同一个包中。

要使客户端代码与 repo 类型无关,实现您自己的 repo 工厂,将 repo 工厂自动连接到客户端代码中,并让您的 repo 工厂在返回特定内容之前检查应用程序状态回购实施。