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 工厂在返回特定内容之前检查应用程序状态回购实施。
用例:
在 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 工厂在返回特定内容之前检查应用程序状态回购实施。