我有一个用例,我必须与两个不同的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), 根据春季官方github code,我们可以做到。
但是我们可以使用上面两个不同的jdbcTemplate
来使用JPA repository
与不同的MySQL数据库进行通信吗?
我认为内部JPA
也在使用数据库实例(jdbcTemplate
)。
那么有可能以某种方式将数据库的实例传递给JPA repository
并与不同的数据库进行通信吗?
答案 0 :(得分:1)
好的,现在我已经正确地阅读了这个问题。您将需要2个事务管理器,每个数据库一个。
上面的配置应该是这样的:
@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 {