2014-05-06 3 views
1

J'ai déjà parcouru les questions existantes à ce sujet mais je ne suis toujours pas satisfait.Comment puis-je configurer plusieurs instances de bases de données?

Pour ajouter la configuration de base de données multiples, suivant est l'info je suis arrivé jusqu'à présent est -

1) Mettre à jour le fichier config.yml -

database1: 
    driverClass: com.mysql.jdbc.Driver 
    user: user1 
    password: user!23 
    url: jdbc:mysql://url.to.connect:3306/db1 
    properties: charSet: UTF-8 
    maxWaitForConnection: 1s 
    validationQuery: "/* MyService Health Check */ SELECT 1" 
    minSize: 8 
    maxSize: 32 
    checkConnectionWhileIdle: false 
    checkConnectionHealthWhenIdleFor: 10s 
    closeConnectionIfIdleFor: 1 minute 

database2: 
    driverClass: com.mysql.jdbc.Driver 
    user: user2 
    password: user!23 
    url: jdbc:mysql://url.to.connect:3306/db2 
    properties: charSet: UTF-8 
    maxWaitForConnection: 1s 
    validationQuery: "/* MyService Health Check */ SELECT 1" 
    minSize: 8 
    maxSize: 32 
    checkConnectionWhileIdle: false 
    checkConnectionHealthWhenIdleFor: 10s 
    closeConnectionIfIdleFor: 1 minute 

2) Ajouter les modifications au fichier de configuration java.

public class DropWizardConfiguration extends Configuration{ 

    @Valid 
    @NotNull 
    @JsonProperty 
    private DatabaseConfiguration database1 = new DatabaseConfiguration(); 

    @Valid 
    @NotNull 
    @JsonProperty 
    private DatabaseConfiguration database2 = new DatabaseConfiguration(); 

    public DatabaseConfiguration getDatabaseConfiguration1() 
    {  
     return database1; 
     } 

     public DatabaseConfiguration getDatabaseConfiguration2() 
    {  
     return database2; 
     } 
} 

3) Dans cette étape, je devrais mettre à jour le service DropWizard pour gérer l'instance de base de données respective. Mais c'est là que je vais dans une boîte noire, je ne suis pas sûr de la configuration à changer ou Comment changer!

Appréciez certaines entrées.

Répondre

0

J'ai récemment dû faire quelque chose de similaire et la façon dont je l'ai fait était en utilisant BeanDefinitionRegistryPostProcessor. J'ai utilisé jdbcTemplates mais il devrait être transférable aux sessions d'hibernation aswel. En faisant cela, j'ai été en mesure d'ajouter n'importe quelle quantité de bases de données et les haricots seraient créés. puis ajoutez simplement les beans dans le fichier de contexte.

Ce que je ne faisais que dans la configuration

@Valid 
@NotNull 
@JsonProperty("database") 
private Collection<DataSourceConfig> databases; 

public Collection<DataSourceConfig> getDatabase() { 
    return databases; 
} 

Ceci est ma classe DataSourceConfig

public class DataSourceConfig { 

@JsonProperty 
private String name; 

@JsonProperty 
private String driverClassName; 

@JsonProperty 
private String username; 

@JsonProperty 
private String password; 

@JsonProperty 
private String url; 

public String getDriverClassName() { 
    return driverClassName; 
} 

public void setDriverClassName(String driverClassName) { 
    this.driverClassName = driverClassName; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

Ceci est la méthode de ma classe qui implémente BeanDefinitionPostProcessor

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 

    /** 
    * Builds JdbcTemplates for beans 
    */ 
    Map<String,String> jdbcTemplateBeanNames = Maps.newHashMap(); 
    for (DataSourceConfig dsc : configuration.getDatabase()) { 
     AbstractBeanDefinition jdbcTemplateDefinition = BeanDefinitionBuilder.rootBeanDefinition("org.springframework.jdbc.core.JdbcTemplate") 
       .addPropertyValue("dataSource", 
         BeanDefinitionBuilder.genericBeanDefinition(DriverManagerDataSource.class) 
          .addPropertyValue("driverClassName", dsc.getDriverClassName()) 
          .addPropertyValue("url", dsc.getUrl()) 
          .addPropertyValue("username", dsc.getUsername()) 
          .addPropertyValue("password", dsc.getPassword()) 
          .getBeanDefinition() 
       ) 
       .getBeanDefinition(); 
     String name = BeanDefinitionReaderUtils.registerWithGeneratedName(jdbcTemplateDefinition, registry); 
     jdbcTemplateBeanNames.put(dsc.getName(), name); 

    } 
Questions connexes