Java 如何配置多个数据库实例?
我已经讨论了关于这个问题的现有问题,但仍然不满足于核心问题 要添加多个数据库配置,以下是我目前获得的信息- 1更新config.yml文件-Java 如何配置多个数据库实例?,java,dropwizard,Java,Dropwizard,我已经讨论了关于这个问题的现有问题,但仍然不满足于核心问题 要添加多个数据库配置,以下是我目前获得的信息- 1更新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:
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将更改添加到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在这一步中,我应该更新DropWizard服务来处理相应的数据库实例
public class DropWizardService extends Service<DropWizardConfiguration>{
private final HibernateBundle<DropWizardConfiguration> hibernate = new HibernateBundle<DropWizardConfiguration>(Game.class) {
// @Override
public DatabaseConfiguration getDatabaseConfiguration(DropWizardConfiguration configuration){
return configuration.getDatabaseConfiguration();
}
};
@Override
public void initialize(Bootstrap<DropWizardConfiguration> bootstrap) {
bootstrap.addBundle(hibernate);
}
public void run() throws Exception{
this.run(new String[]{"server", "./config.yml"});
}
@Override
public void run(DropWizardConfiguration configuration, Environment environment) throws Exception {
SessionFactory factory = hibernate.getSessionFactory();
environment.addResource(new MyResource(factory));
}
}
但这就是我要进入黑盒的地方,我不确定要更改什么配置或如何更改
感谢您的支持。我最近不得不做一些类似的事情,我的做法是使用BeanDefinitionRegistryPostProcessor。我使用了jdbcTemplates,但它也可以转移到hibernate会话。这样做是因为我可以添加任意数量的数据库,然后创建bean。然后在上下文文件中添加bean 我所做的是在配置中
@Valid
@NotNull
@JsonProperty("database")
private Collection<DataSourceConfig> databases;
public Collection<DataSourceConfig> getDatabase() {
return databases;
}
这是我的类中实现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);
}
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);
}