【问题标题】:Spring Data JPA | Dynamic runtime multiple database connectionSpring Data JPA |动态运行时多数据库连接
【发布时间】:2015-03-24 13:18:21
【问题描述】:

用例:

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

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

如何使用 Spring Data JPA 实现这一点?

【问题讨论】:

    标签: spring-data-jpa jboss5.x


    【解决方案1】:

    切换数据源的一种方法是定义一个配置有“运行时”数据源的“运行时”存储库。但这会让客户端代码知道不同的 repos:

    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;
        }
    }
    

    我已合并代码以节省空间;您可以在不同的文件中定义 javaconfig 和 repo 接口,但在同一个包中。

    要使客户端代码与 repo 类型无关,实现您自己的 repo factory,将 repo factory 自动装配到客户端代码中,并让您的 repo factory 在返回特定 repo 实现之前检查应用程序状态。 p>

    【讨论】:

    • 我们已经在应用程序中实现了一个现有的基于 xml 的方法。当我们尝试将上述解决方案集成到应用程序中时,会出现以下异常;没有定义 [javax.persistence.EntityManagerFactory] ​​类型的合格 bean:预期的单个匹配 bean,但找到了 2 个,其中一个 EntityManagerFactory 将是在我们的 xml 中配置的一个,另一个是根据您的解决方案新配置的。有什么建议吗?
    • 您是否尝试过按名称而不是按类型自动装配?见understanding-spring-autowired-usage
    猜你喜欢
    • 2019-10-25
    • 2018-06-03
    • 2016-12-02
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多