2012-10-24 68 views
0

我有一個默認數據庫,有時我必須在另一個數據庫中進行選擇。未使用Spring 3和MyBatis路由DataSource

我在這裏搜索了很多博客和問題,但無法使其工作。

試過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也不會改變。

任何人都可以幫助我嗎?

回答

0

嘗試將靜態方法設置爲非靜態方法,並在上下文持有者傳遞R引用。

+0

R參考?我怎樣才能做到這一點? – nataliaoliveira

0

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

AbstractRoutingDataSource只會在調用getConnection時更改數據源。無論您使用的持久性框架是緩存連接,還是不在persistence.getObject()之間調用getConnection。但是,您正在獲取持久性對象,請在更改DataSourceContextHolder中的數據源後嘗試獲取新的持久性對象。如果這可以解決您的問題,請嘗試創建一個維護持久性對象的類並處理更改數據源。這樣,當您更改數據源時,您可以在一個位置修改持久性管理器對象。

+0

我試過了,沒有運氣。 – nataliaoliveira