2017-10-16 4 views
1

J'ai un cas d'utilisation dans lequel je dois communiquer avec deux bases de données Mysql différentes.Connexion à une source de données différente en utilisant JPA avec l'instance de source de données de source

En utilisant MysqlTemplate Je suis en mesure de mettre en œuvre avec succès mon cas d'utilisation à l'aide du code ci-dessous

@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); 
     } 
    } 

Ce code ci-dessus initialise deux instances différentes de modèle JdbcTemplate (un pour une source de données).

Ce que je suis en train de faire maintenant est:

Si nous voulons connecter à deux sources de données différentes (Mysql) à l'aide de JPA, selon ressort officiel github code, nous pouvons le faire.

Mais pouvons-nous utiliser au-dessus de deux jdbcTemplate différents pour communiquer avec différentes bases de données MySQL en utilisant JPA repository? Ce que je crois est que JPA utilise également une instance de la base de données (jdbcTemplate).

Alors est-il possible de passer en quelque sorte une instance de la base de données à JPA repository et de communiquer avec différentes bases de données?

Répondre

0

Ok, nouvelle réponse maintenant J'ai lu la question correctement. Vous aurez besoin de 2 gestionnaires de transactions, un pour chaque base de données.

Votre configuration ci-dessus doit être quelque chose comme ceci:

@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; 
    } 
} 

Ensuite, dans votre service, ou DAO, vous pouvez décider quelle base de données à utiliser

@Service 
@Transactional(transactionManager = "transactionManager1") 
public class Service { 
+0

Pouvons-nous utiliser différentes bases de données en même temps en utilisant cette ? –