2017-04-24 1 views
1

J'utilise Spring Boot et Liquibase pour initialiser une base de données pour mon projet. En raison de nouvelles exigences, je dois diviser mes tables de base de données entre deux schémas différents.Spring Boot - Configurer et initialiser plusieurs sources de données

J'ai réussi à configurer les deux sources de données pour mon projet en utilisant l'annotation @Primary mais je me demande s'il existe un moyen d'initialiser les deux bases de données séparément, en créant des tables différentes pour chaque base de données.

le moment, je ne peux obtenir ma base de données primaire initialisées en utilisant le script yaml liquibase que j'avais initialement

Répondre

1

J'ai réussi à initialiser les deux bases de données par en utilisant deux haricots Liquibase. Dans ma classe de configuration que je donne les résultats suivants

@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSource dataSource() { 
    return DataSourceBuilder.create().build(); 
} 

@Bean(name = "primaryLiquibaseProperties") 
@ConfigurationProperties("liquibase-changelogs.primary.liquibase") 
public LiquibaseProperties primaryLiquibaseProperties() { 
    return new LiquibaseProperties(); 
} 

@Bean(name = "liquibase") 
public SpringLiquibase primaryLiquibase(@Qualifier("primaryLiquibaseProperties") LiquibaseProperties liquibaseProperties) { 
    SpringLiquibase primary = new SpringLiquibase(); 
    primary.setDataSource(dataSource()); 
    primary.setChangeLog(primaryLiquibaseProperties().getChangeLog()); 

    return primary; 
} 

@Bean(name = "metadata_datascource") 
@ConfigurationProperties("spring.metadata_datascource") 
public DataSource metadataDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

@Bean(name = "metadataLiquibaseProperties") 
@ConfigurationProperties("liquibase-changelogs.metadate.liquibase") 
public LiquibaseProperties metadataLiquibaseProperties() { 
    return new LiquibaseProperties(); 
} 

@Bean(name = "metadata-liquibase") 
public SpringLiquibase metadataLiquibase(@Qualifier("metadataLiquibaseProperties") LiquibaseProperties liquibaseProperties) { 
    SpringLiquibase metadata = new SpringLiquibase(); 
    metadata.setDataSource(metadataDataSource()); 
    metadata.setChangeLog(metadataLiquibaseProperties().getChangeLog()); 

    return metadata; 
} 

et dans mes propriétés je:

spring: 
    datasource: 
    driver-class-name: org.postgresql.Driver 
    url: ... 
    username: abc 
    password: abc 
    jpa: 
     hibernate: 
     ddl-auto: update 
    metadata_datascource: 
    driver-class-name: org.postgresql.Driver 
    url: ... 
    username: abc 
    password: abc 
    jpa: 
     hibernate: 
     ddl-auto: update 

liquibase-changelogs: 
    primary: 
    liquibase: 
     change-log: classpath:db/changelog/primary.yaml 
    metadata: 
    liquibase: 
     change-log: classpath:db/changelog/metadata.yaml 
1

Oui, plusieurs sources de données ou tout autre type de haricot est possible dans Spring. Il est juste nécessaire pour vous assurer que le printemps est en mesure d'identifier l'instance à autowire où, donc en gros

  1. utilisation bean id
  2. utilisation @Qualifier lorsque Autowiring
+0

Désolé, mais cela ne répond pas à ma question concernant l'initialisation. Comme je l'ai écrit ci-dessus, je peux configurer les deux sources de données mais je ne peux pas obtenir de la liquibase pour initialiser les deux en utilisant Liquibase. Sauf si vous suggérez deux haricots liquibase en utilisant différentes sources de données. Si c'est le cas, pourriez-vous donner un exemple sur la façon de le faire? – mariosk89