2017-10-16 64 views
1

不同数据源我具有其中我有两个不同的MySQL数据库进行通信的用例。连接到使用JPA与弹簧DataSource实例

使用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模板(每个数据源的一个)的两个不同的实例来实现我的用例。

什么我想现在要做的是:

如果我们想根据弹簧官方github code连接到使用JPA两个不同的数据源(MySQL的), ,我们可以做到这一点。

但是,我们可以使用上面两种不同jdbcTemplate用于使用JPA repository不同的MySQL数据库进行通信?

我相信的是,内部JPA也使用的数据库(jdbcTemplate)的一个实例。

那么,它可能以某种方式通过数据库的实例来JPA repository并与不同的数据库进行沟通?

回答

0

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

我们可以使用不同的数据库在同一时间使用该? –