[英]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.