为了解决这一问题,可以利用Spring提供的抽象类:AbstractRoutingDataSource.
1. 定义一个实现类(如:DynamicDataSource)实现它,并重写Object determineCurrentLookupKey()方法
protected Object determineCurrentLookupKey(){
return DataSourceHolder.getDataSourceType();
}
public class DataSourceHodler{
privatge final static ThreadLocal<Long> contextHolder = new ThreadLocal<Long>();
public static void setDataSourceType(Long dsType){
contextHolder.set(dsType);
}
public static Long getDataSourceType(){
return contextHolder.get();
}
public static void remove(){
contextHolder.remove();
}
}
2. 把实现类配置在spring的配置文件中,并注入两个属性:targetDataSrouces、defaultTargetDataSource.
<bean id="subDatasource1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/sub_db"></property>
</bean>
targetDataSrouces赋值为:
<util:map id="dynDataSourceMap" key-value="java.lang.Long">
<entry key="1" value-ref="subDataSource1"></entry>
....
</util:map>