私はかなりの時間のために、この問題に苦労し、私はそれをハックするために管理!そのため、クライアント用の新しいDBが追加された場合、各クライアントは専用のDBを持ち、スキーマ設計は同じであるため、データベースはソフトウェアを介して即座にアクセスできます。
データソースは、必要なDBに接続するために実行時に変更されます。典型的には、我々の規約は、ユーザのアカウント名はDb名である。
のApplicationContext:ここ
https://serverurl/accountnameが内訳です。XML TenantRouterクラスで
<bean id="dataSource" class="com.package.util.TenantRouter">
<property name="targetDataSources">
<map>
<entry key="db" value-ref="db"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="parentDataSource"/>
</bean>
<bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:6432/db?autoReconnect=true"/>
<property name="username" value="DBUSER"/>
<property name="password" value="DBPASS"/>
</bean>
<bean id="db" parent="parentDataSource">
<property name="url" value="jdbc:postgresql://localhost:5432/db?autoReconnect=true"/>
<property name="username" value="DBUSER"/>
<property name="password" value="DBPASS"/>
</bean>
、これらの2つの方法が不可欠です:
@Override
protected Object determineCurrentLookupKey() {
String tenant="defaultdb";
if (UserContextUtil.getUserContext()!=null){
tenant = UserContextUtil.getUserContext().getTenant().toString();
}
return tenant;
}
@Override
protected DataSource determineTargetDataSource() {
//current DB
String db_name = (String) determineCurrentLookupKey();
//System.out.println("THIS DB:"+db_name);
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("org.postgresql.Driver");
String url="jdbc:postgresql://localhost:5432/"+db_name+"?autoReconnect=true";
//System.out.println("URL:"+url);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
UserContextUtil.getUserContext().getTenant().toString()
は、クライアントのURLで提供されるためにどの接続するために要求さDbとを返します。
私はこれがこのような頭痛を経験する人に役立つことを願っています。
乾杯!
あなたは実際に動的に作成されたdbsを作成して使用しましたか? – Lipis