我有一个用例,在这个用例中,我必须与两个不同的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 {

10-02 00:04
查看更多