我使用SpringBoot和Hibernate作为持久化提供者。对于我的应用程序,我需要在2个数据库之间动态选择。
(For simplicity sake,
domain : localhost:8080 ---> hem1 DB
domain : 127.0.0.1:8080 ---> hem2 DB
)
下面是AbstractRoutingDB的实现
public class MyRoutingDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
/*
* this is derived from threadlocal set by filter for each web
* request
*/
return SessionUtil.getDB();
}
}
以下是DB配置:
package com.hemant.basic.dataSource;
import java.beans.PropertyVetoException;
import java.util.HashMap;
import java.util.Map;
import javax.naming.ConfigurationException;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.mchange.v2.c3p0.ComboPooledDataSource;
@Configuration
public class DBConfig {
@Bean(name = "dataSource")
public DataSource dataSource() throws PropertyVetoException,
ConfigurationException {
MyRoutingDataSource routingDB = new MyRoutingDataSource();
Map<Object, Object> targetDataSources = datasourceList();
// hem1 is the default target DB
routingDB.setDefaultTargetDataSource(targetDataSources.get(1));
routingDB.setTargetDataSources(targetDataSources);
routingDB.afterPropertiesSet();
return routingDB;
}
private Map<Object, Object> datasourceList() throws PropertyVetoException,
ConfigurationException {
final Map<Object, Object> datasources = new HashMap<Object, Object>();
ComboPooledDataSource datasource = null;
for (int id = 1; id <= 2; id++) {
datasource = getDatasource(id);
datasources.put(id, datasource);
}
return datasources;
}
private ComboPooledDataSource getDatasource(int id)
throws PropertyVetoException, ConfigurationException {
ComboPooledDataSource datasource = new ComboPooledDataSource();
// set the connection pool properties
datasource.setJdbcUrl("jdbc:postgresql://localhost/hem" + id);
datasource.setUser("hemant");
datasource.setPassword("");
datasource.setDriverClass("org.postgresql.Driver");
datasource.setMaxPoolSize(30);
datasource.setInitialPoolSize(10);
datasource.setMinPoolSize(10);
return datasource;
}
}
此外,在application.properties中也有以下设置,以便启用自动模式更新。
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
问题:当我启动应用程序时,hbm2ddl模式更新仅在hem1 (defaultTargetDb)上执行,而不在其他目标数据库上执行
以下是启动日志的一部分
[main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000228: Running hbm2ddl schema update
[main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000102: Fetching database metadata
[main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000396: Updating schema
[main] java.sql.DatabaseMetaData : HHH000262: Table not found: users
[main] java.sql.DatabaseMetaData : HHH000262: Table not found: users
[main] java.sql.DatabaseMetaData : HHH000262: Table not found: users
[main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000232: Schema update complete`enter code here`
仅对1个DB执行此操作。
**稍后当我执行rest URL的时候
GET localhost:8080/users -为更新的DB hem1成功获取结果。
但当访问GET 127.0.0.1:8080/users时,由于没有更新/创建模式,导致SQL异常**
如何确保在AbstractRoutingDataSource的所有目标数据库上执行"hbm2ddl模式更新
发布于 2016-12-20 01:33:10
据我所知,您不能在多租户环境中设置模式导出。当您定义多租户环境时,默认情况下,连接到默认数据库只是为了获得连接。这就是为什么只在一个数据库中创建的原因。它不会访问所有要创建的数据库/模式,因为它不知道彼此。
保存SQL数据库创建文件,并在每次创建新租户时执行该文件。我认为您可以在需要时使用Spring PersistenceContext为您创建它。
https://stackoverflow.com/questions/37273880
复制相似问题