Spring Data JPA | Динамическое соединение с несколькими базами данных во время выполнения
Случай использования:
Во время запуска сервера JBoss одно постоянное соединение с базой данных уже установлено с использованием конфигураций Spring Data JPA (подход на основе xml).
Теперь, когда приложение уже запущено и работает, необходимо подключиться к нескольким базам данных, а строка подключения является динамической, которая доступна во время выполнения.
Как этого добиться, используя Spring Data JPA?
1 ответ
Одним из способов переключения источника данных является определение репозитория "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;
}
}
Я объединил код для экономии места; вы должны определить javaconfig и интерфейс репо в отдельных файлах, но в одном пакете.
Чтобы сделать клиентский код независимым от типа репо, внедрите свою собственную фабрику репо, автоматически подключите фабрику репо к клиентскому коду и попросите свою фабрику репо проверить состояние приложения перед возвратом конкретной реализации репо.