2015-07-23 1 views
1

Deux instances H2 différentes à créer en mémoire. Pour s'assurer que cela arrive, j'ai initialisé les deux instances avec le même shema et différentes données. Alors que lorsque je interroge en utilisant DAO ensemble différent de données prélevées à partir de différentes sources de données. Cependant, cela ne se produit pas. Qu'est-ce que je fais mal? Comment nommer l'instance de H2 correcte?Spring + plusieurs instances H2 en mémoire

@Bean(name = "DS1") 
@Primary 
public EmbeddedDatabase dataSource1() { 
    return new EmbeddedDatabaseBuilder(). 
      setType(EmbeddedDatabaseType.H2). 
      setName("DB1"). 
      addScript("schema.sql"). 
      addScript("data-1.sql"). 
      build(); 

} 

@Bean(name = "DS2") 
public EmbeddedDatabase dataSource2() { 
    return new EmbeddedDatabaseBuilder(). 
      setType(EmbeddedDatabaseType.H2). 
      setName("DB2"). 
      addScript("schema.sql"). 
      addScript("data-2.sql"). 
      build(); 

} 
+0

Votre 'schema.sql' crée-t-il des bases de données avec le même nom? – woemler

+1

Vous ne pouvez pas déclarer deux beans principaux d'un même type - probablement la cause d'un comportement inattendu – Mikhail

+0

Il s'agissait d'une faute de frappe dans le copier-coller. En fait, seul le premier DS est @Primary. Cela ne marche toujours pas. – sreehari

Répondre

0

Vous avez créé deux sources de données et ont marqué un comme @Primary - c'est celui qui sera utilisé lorsque votre EntityManagerFactories et Référentiels sont configurées automatiquement. C'est pourquoi les deux DAO accèdent à la même base de données.

Pour contourner ce problème, vous devez déclarer deux EntityManagerFactories séparés, comme décrit dans la documentation de démarrage Spring:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-use-two-entity-managers

Après cela, vous aurez besoin de déclarer deux dépôts séparés et dire chaque référentiel de l'EntityManagerFactory à utiliser. Pour ce faire, dans votre annotation @EnableJpaRepositories, vous devrez spécifier l'entité EntityMangerFactory correcte. Cet article décrit très bien comment faire:

http://scattercode.co.uk/2013/11/18/spring-data-multiple-databases/

Ce serait bien si le printemps Boot soutenu autoconfiguration avec deux sources de données, mais je ne pense pas que ça va se passer bientôt:

https://github.com/spring-projects/spring-boot/issues/808

0

Le problème ne concernait pas plusieurs instances de H2; mais avec injection DataSource. Je l'ai résolu en passant le qualificateur dans l'argument de la méthode.

@Autowired 
@Bean(name = "jdbcTemplate") 
public JdbcTemplate getJdbcTemplate(@Qualifier("myDataSource") DataSource dataSource) { 
    return new JdbcTemplate(dataSource); 
}