我有一个用例,在这个用例中,我必须与两个不同的Mysql数据库通信。
使用MysqlTemplate,我可以使用下面的代码成功地实现我的用例
@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);
}
}
上面的代码初始化了
JdbcTemplate
模板的两个不同实例(每个实例对应一个数据源)。我现在要做的是:
如果我们想使用JPA连接到两个不同的数据源(Mysql),
据春季官方报道,我们可以做到。
但是,我们可以使用上面两个不同的
jdbcTemplate
来使用JPA repository
与不同的MySQL数据库通信吗?我认为内部
JPA
也在使用数据库的实例(jdbcTemplate
)。那么,是否可以通过某种方式将数据库实例传递到
JPA repository
并与不同的数据库通信? 最佳答案
好的,新的答案现在我已经正确地读过了。您需要两个事务管理器,每个数据库一个。
上面的配置应该是这样的:
@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;
}
}
然后在您的服务或DAO中,您可以决定使用哪个数据库
@Service
@Transactional(transactionManager = "transactionManager1")
public class Service {