簡體   English   中英

不使用Spring 3和MyBatis路由數據源

[英]Not routing DataSource with Spring 3 and MyBatis

我有一個默認數據庫,有時我必須在另一個數據庫中進行選擇。

我在這里搜索了許多博客和問題,但無法使其正常工作。

嘗試了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時,它不會更改。

誰能幫我?

嘗試將兩個靜態方法都設為非靜態方法,並在上下文持有者通過的情況下傳遞R引用。

首先,確保database2DS正常運行。 設置defaultTargetDatasource database2DS並確認它仍未使用DB1,並且使用database2DS作為默認值時沒有其他錯誤。 如果AbstractRoutingDataSource無法解析targetDataSources中的數據源,則無法切換到該數據源。

僅在調用getConnection時,AbstractRoutingDataSource才會更改DataSource。 無論使用哪種持久性框架,都可能會緩存Connection而不在persistency.getObject()之間調用getConnection。 但是,如果要獲取持久性對象,請在DataSourceContextHolder中更改數據源后嘗試獲取新的持久性對象。 如果這解決了您的問題,請嘗試創建一個類來維護您的持久性對象並處理更改數據源。 這樣,當您更改數據源時,可以一次修改持久性管理器對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM