Reputation: 4066
I have a use-case in which I have to communicate with two different Mysql databases.
Using MysqlTemplate I am successfully able to implement my use-case using below code
@Configuration
public class MySqlConfiguration {
@Primary
@Bean(name = "dbA")
@ConfigurationProperties("spring.url-a")
public DataSource dbA() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
@Qualifier("jdbcDbA")
public JdbcTemplate dbATemplate(@Qualifier("dbA") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "dbB")
@ConfigurationProperties(prefix = "spring.url-b")
public DataSource dbB() {
return DataSourceBuilder.create().build();
}
@Bean
@Qualifier("jdbcdbB")
public JdbcTemplate dbBTemplate(@Qualifier("dbB") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
This above code initializes two different instances of JdbcTemplate
template (one each for a data source).
What I am trying to do now is:
If we want to connect to two different data sources(Mysql) using JPA, according to spring-official github code, we can do it.
But can we use above two different jdbcTemplate
for communicating with different MySQL databases using JPA repository
?
What I believe is that internally JPA
is also using an instance of the database(jdbcTemplate
).
So is it possible to somehow pass an instance of the database to JPA repository
and communicate with different databases?
Upvotes: 2
Views: 378
Reputation: 7948
Ok, new answer now I have read the question correctly. You will need 2 transaction managers, one for each data base.
Your Config above should be something like this:
@Configuration
public class JpaConfig {
@Bean
public DataSource dataSource1() {
return DataSourceBuilder
.create()
.username("")
.password("")
.url("")
.driverClassName("")
.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManager1(DataSource dataSource1) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource1);
entityManagerFactory.setPackagesToScan("entities for dataSource 1");
return entityManagerFactory;
}
@Bean(name = "transactionManager1")
public JpaTransactionManager transactionManager1(EntityManagerFactory entityManager1) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManager1);
return transactionManager;
}
@Bean
public DataSource dataSource2() {
return DataSourceBuilder
.create()
.username("")
.password("")
.url("")
.driverClassName("")
.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManager2(DataSource dataSource2) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource2);
entityManagerFactory.setPackagesToScan("entities for dataSource 2");
return entityManagerFactory;
}
@Bean(name = "transactionManager2")
public JpaTransactionManager transactionManager2(EntityManagerFactory entityManager2) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManager2);
return transactionManager;
}
}
Then in your service, or DAO you can decide which database to use
@Service
@Transactional(transactionManager = "transactionManager1")
public class Service {
Upvotes: 2