2016-05-17 4 views
5

私は、永続性プロバイダとして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のすべてのターゲットデータベースについて

答えて

0

私が知る限り、マルチテナント環境ではスキーマのエクスポートを設定できません。マルチテナント環境を定義する場合、デフォルトでは、接続を確立するためにのみデフォルトのデータベースに接続されます。このため、1つのデータベースでのみ作成されます。お互いを知らないので、作成するすべてのデータベース/スキーマにアクセスすることはありません。

新しいテナントを作成するたびにSQLデータベース作成ファイルを保存して実行します。私はあなたが必要なときにSpring PersistenceContextを使ってそれを作成できると思います。

関連する問題