Я пытаюсь правильно настроить несколько источников данных в 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
и DB2
;и PROD2 также имеет DB1
и DB2
.
До сих пор я успешно завершил настройку DEV .У меня есть 2 конфигурации:
- для
DB1
- для
DB2
Тогда у меня есть 2 Repos:
- для
ABC
, который пишет в DB1
- для
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;
}
}