私は、永続性プロバイダとしてHibernateと共にSpringBootを使用しています。 私のアプリケーションでは、2つのDBの中から動的に選択する必要がありました。Spring AbstractRoutingDataSource + Hibernate- Hbm2ddlSchemaUpdateはデフォルトDBでのみ実行されます
(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構成されている自動スキーマ更新がONになるように
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に対してのみ実行されます。その後、私はのは
GET localhostを言い、残りURL実行時に
**:8080 /ユーザーを - 結果が更新されたDBのhem1のために正常にフェッチされています。
しかしGETの127.0.0.1:8080/usersにアクセスしたときにスキーマが作成/更新されていないため、ITは、SQL例外になり**
どのように我々は「hbm2ddlスキーマの更新」を実行していることを確認することができますAbstractRoutingDataSourceのすべてのターゲットデータベースについて