【发布时间】:2015-03-24 13:18:21
【问题描述】:
用例:
在 JBoss 服务器启动期间,已经使用 Spring Data JPA 配置(基于 xml 的方法)建立了一个永久数据库连接。
现在,当应用程序已经启动并运行时,要求连接到多个数据库,并且连接字符串是动态的,在运行时可用。
如何使用 Spring Data JPA 实现这一点?
【问题讨论】:
用例:
在 JBoss 服务器启动期间,已经使用 Spring Data JPA 配置(基于 xml 的方法)建立了一个永久数据库连接。
现在,当应用程序已经启动并运行时,要求连接到多个数据库,并且连接字符串是动态的,在运行时可用。
如何使用 Spring Data JPA 实现这一点?
【问题讨论】:
切换数据源的一种方法是定义一个配置有“运行时”数据源的“运行时”存储库。但这会让客户端代码知道不同的 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>
【讨论】: