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 и интерфейс репо в отдельных файлах, но в одном пакете.

Чтобы сделать клиентский код независимым от типа репо, внедрите свою собственную фабрику репо, автоматически подключите фабрику репо к клиентскому коду и попросите свою фабрику репо проверить состояние приложения перед возвратом конкретной реализации репо.

Другие вопросы по тегам