gpt4 book ai didi

java - 使用带有 spring 数据源实例的 JPA 连接到不同的数据源

转载 作者:行者123 更新时间:2023-11-29 02:13:01 25 4
gpt4 key购买 nike

我有一个用例,其中我必须与两个不同的 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),据spring-official github code ,我们可以做到。

但是我们可以使用以上两个不同的jdbcTemplate 来使用JPA 存储库 与不同的MySQL 数据库进行通信吗?

我认为 JPA 内部也在使用数据库实例 (jdbcTemplate)。

那么是否有可能以某种方式将数据库实例传递到 JPA 存储库 并与不同的数据库进行通信?

最佳答案

好的,新答案现在我已经正确阅读了问题。您将需要 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 {

关于java - 使用带有 spring 数据源实例的 JPA 连接到不同的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com