0

デフォルトのデータベースがあり、別のデータベースを選択する必要がある場合があります。

ここでこれについて多くのブログや質問を検索しましたが、うまくいきませんでした。

http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/の方法を試しました。何もない。

RouterDataSource クラスのコード:

public class RouterDataSource extends AbstractRoutingDataSource {   
    @Override
    protected DataSourceEnum determineCurrentLookupKey() {
         return DataSourceContextHolder.getTargetDataSource();
    }   
}

DataSourceContextHolder クラスのコード:

public class DataSourceContextHolder {
     private static final ThreadLocal<DataSourceEnum> contextHolder = new ThreadLocal<DataSourceEnum>();

     public static void setTargetDataSource(DataSourceEnum targetDataSource) {
         Assert.notNull(targetDataSource, "Target data source cannot be null");
         contextHolder.set(targetDataSource);
     }

     public static DataSourceEnum getTargetDataSource() {
         if (contextHolder.get() != null)
             return (DataSourceEnum) contextHolder.get();
         else
             return DataSourceEnum.DB1;
     }

     public static void resetDefaultDataSource() {
         contextHolder.remove();
     }
}

データベースを変更するメソッド呼び出しのコード:

@Override
public CodeHD getCategoryByCode(String code) throws BusinessException {
    DataSourceContextHolder.setTargetDataSource(DataSourceEnum.DATABASE2);
    return (CodeHD) persistency.getObject(GETOBJECT_BY_CODE, code);
}

DatasourceEnum クラスのコード:

public enum DataSourceEnum {
    DB1,
    DB2;
}

最後に、私の applicationContext.xml の構成:

<bean id="parentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" abstract="true">
    <property name="driverClass" value="oracle.jdbc.pool.OracleDataSource" />
    <property name="acquireIncrement" value="10" />
    <property name="idleConnectionTestPeriod" value="60" />
    <property name="maxStatements" value="50" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="15" />
</bean>

<bean id="database1DS" parent="parentDataSource">
    <property name="jdbcUrl" value="jdbc:oracle:thin:@database1:1521:xe" />
    <property name="user" value="user" />
    <property name="password" value="password" />
</bean>

<bean id="database2DS" parent="parentDataSource">
    <property name="jdbcUrl" value="jdbc:oracle:thin:@database2:1521:xe" />
    <property name="user" value="user" />
    <property name="password" value="password" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource"/>
  </bean>

<bean id="dataSource" class="package.RouterDataSource">
    <property name="defaultTargetDataSource" ref="database1DS"/>
    <property name="targetDataSources">
        <map key-type="package.DataSourceEnum">
            <entry key="DB1" value-ref="database1DS"/>
            <entry key="DB2" value-ref="database2DS"/>
        </map>
    </property>
</bean>

問題は、DB2 に設定しても変更されないことです。

誰でも私を助けることができますか?

4

2 に答える 2

0

両方の静的メソッドを非静的にし、コンテキスト ホルダーの場合は R 参照を渡すようにしてください。

于 2012-10-24T18:53:47.713 に答える
0

最初に、database2DS が正しく動作していることを確認してください。defaultTargetDatasource を database2DS にして、DB1 がまだ使用されていないこと、および database2DS をデフォルトとして使用して他のエラーがないことを確認します。AbstractRoutingDataSource が targetDataSources の DataSource を解決できない場合、それに切り替えることはできません。

AbstractRoutingDataSource は、getConnection が呼び出されたときにのみ DataSource を変更します。使用している永続化フレームワークは、おそらく Connection をキャッシュしており、persistency.getObject() の間で getConnection を呼び出していません。ただし、持続性オブジェクトを取得しています。DataSourceContextHolder のデータソースを変更した後、新しい持続性オブジェクトを取得してみてください。これで問題が解決する場合は、持続性オブジェクトを維持し、データソースの変更を処理するクラスを作成してみてください。そうすれば、データソースを変更するときに、持続性マネージャー オブジェクトを 1 か所で変更できます。

于 2012-10-24T20:15:45.487 に答える