Spring boot: как правильно настроить и использовать несколько источников данных - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь правильно настроить несколько источников данных в Spring Boot with JPA 2.1.4.RELEASE.Установка выглядит примерно так:

  • DEV : 1 сервер с 2 дБ: DB1 и DB2.DB1 имеет ABC таблицу, а DB2 имеет XYZ таблицу.
  • PROD : 2 сервера PROD1 и PROD2 обажить-жить.Каждый сервер PROD имеет ту же настройку, что и DEV , т.е. PROD1 имеет DB1 и DB2PROD2 также имеет DB1 и DB2.

До сих пор я успешно завершил настройку DEV .У меня есть 2 конфигурации:

  1. для DB1
  2. для DB2

Тогда у меня есть 2 Repos:

  1. для ABC, который пишет в DB1
  2. для XYZ, который пишет в DB2

Теперь в PROD , мне нужнозапись данных на оба сервера ( PROD1 и 2 ) в одной транзакции с использованием весенней загрузки.

Я вижу один пример здесь , который пытаетсяпредоставить какое-то решение, но проблема в том, что он попросит создать дубликаты классов Dao и Service, что, я думаю, не является хорошим способом решения этой проблемы, и необходимо понять, как правильно настроить эти свойства в application.properties и DataSourceConfig.java.

application-dev.properties

datasource.db1.url=jdbc:sqlserver://localhost:1234;databaseName=db1;
datasource.db1.username=user
datasource.db1.password=pwd
datasource.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

datasource.db2.url=jdbc:sqlserver://localhost:1234;databaseName=db2;
datasource.db2.username=user
datasource.db2.password=pwd
datasource.db2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

application-prod.properties

datasource.prod1.db1.url=jdbc:sqlserver://prodserver1:1234;databaseName=db1;
datasource.prod1.db1.username=user
datasource.prod1.db1.password=pwd
datasource.prod1.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

datasource.prod1.db2.url=jdbc:sqlserver://prodserver1:1234;databaseName=db2;
datasource.prod1.db2.username=user
datasource.prod1.db2.password=pwd
datasource.prod1.db2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

datasource.prod2.db1.url=jdbc:sqlserver://prodserver2:1234;databaseName=db1;
datasource.prod2.db1.username=user
datasource.prod2.db1.password=pwd
datasource.prod2.db1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

datasource.prod2.db2.url=jdbc:sqlserver://prodserver2:1234;databaseName=db2;
datasource.prod2.db2.username=user
datasource.prod2.db2.password=pwd
datasource.prod2.db2.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

Db1DataSourceConfig.java

@Configuration
@EnableJpaRepositories(
        basePackages = "demo.repos.db1",
        entityManagerFactoryRef = "db1EntityManagerFactory",
        transactionManagerRef = "db1TransactionManager")
public class Db1DataSourceConfig {
    @Autowired
    private Environment env;

    @Bean
    @ConfigurationProperties(prefix="datasource.db1")
    public DataSourceProperties db1DataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    public DataSource db1DataSource() {
        DataSourceProperties dataSourceProperties = db1DataSourceProperties();
        return DataSourceBuilder.create()
                .driverClassName(dataSourceProperties.getDriverClassName())
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword())
                .build();
    }

    @Bean
    public PlatformTransactionManager db1TransactionManager() {
        EntityManagerFactory factory = db1EntityManagerFactory().getObject();
        return new JpaTransactionManager(factory);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(db1DataSource());
        factory.setPackagesToScan(new String[]{"demo.entities.db1"});
        factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
        factory.setJpaProperties(jpaProperties);

        return factory;
    }
}

Db2DataSourceConfig.java

@Configuration
@EnableJpaRepositories(
        basePackages = "demo.repos.db2",
        entityManagerFactoryRef = "db2EntityManagerFactory",
        transactionManagerRef = "db2TransactionManager")
public class Db2DataSourceConfig {
    @Autowired
    private Environment env;

    @Bean
    @ConfigurationProperties(prefix="datasource.db2")
    public DataSourceProperties db2DataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    public DataSource db2DataSource() {
        DataSourceProperties dataSourceProperties = db2DataSourceProperties();
        return DataSourceBuilder.create()
                .driverClassName(dataSourceProperties.getDriverClassName())
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword())
                .build();
    }

    @Bean
    public PlatformTransactionManager db2TransactionManager() {
        EntityManagerFactory factory = db2EntityManagerFactory().getObject();
        return new JpaTransactionManager(factory);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(db2DataSource());
        factory.setPackagesToScan(new String[]{"demo.entities.db2"});
        factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
        factory.setJpaProperties(jpaProperties);

        return factory;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...