使用带有spring数据源实例

时间:2017-10-16 14:38:50

标签: java mysql spring hibernate jpa

我有一个用例,我必须与两个不同的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并与不同的数据库进行通信吗?

1 个答案:

答案 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 {