最近在工作中遇到了一个项目要访问oracle不同用户下的表,于是仿照网上朋友们的方案实现了手动切换数据源,方法如下:
首先修改项目里的spring-config.xml,修改的地方如下,
<!-- JNDI 省级数据源 -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="GDWSJFDataSource" />
<property name="resourceRef" value="true" />
</bean>
<!--法院中间库数据源-->
<bean id="dataSource_fy" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="GDFYDataSource_fy" />
<property name="resourceRef" value="true" />
</bean>
<!-- 多数据源 -->
<bean id="dataSourceOption" class="com.mofit.frame.common.MultipleDataSource">
<property name="defaultTargetDataSource" ref="dataSource"/>
<property name="targetDataSources">
<map>
<entry key="dataSource" value-ref="dataSource"/>
<entry key="dataSource_fy" value-ref="dataSource_fy"/>
</map>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- <property name="dataSource" ref="dataSource" /> -->
<!-- 配置多数据源 -->
<property name="dataSource" ref="dataSourceOption"/>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="plugins">
<list>
<!-- MyBatis 分页拦截器 默认的过滤方式只对id以Page结尾的进行拦截(注意区分大小写) -->
<bean id="paginationInterceptor1" class="com.mofit.plus.common.interceptor.PortalPageInterceptor" />
</list>
</property>
</bean>
然后添加 MultipleDataSource.java,如下:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class MultipleDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();
public static void setDataSourceKey(String dataSource) {
dataSourceKey.set(dataSource);
}
@Override
protected Object determineCurrentLookupKey() {
return dataSourceKey.get();
}
}
最后在操作数据库的类里通过 MultipleDataSource.setDataSourceKey("dataSource_fy");手动 (注意:默认数据源需要手动切换回来)
切换,如下:
// 切换数据源为GDFY
MultipleDataSource.setDataSourceKey("dataSource_fy");
List<CzYsxxMap> list = czYsxxService.getUniteListByCondition(syncSearch);
if (list == null || list.size() == 0) {
logger.info("定时同步法院已交数据:数据id:"+id+",通知书号:"+payNoticeNo+"在已收信息表里不存在,开始插入已收信息");
int c = czYsxxService.insertSelective(ysxx);
// 再次切换回GDWSJF
MultipleDataSource.setDataSourceKey("dataSource");
if (c > 0) {
logger.info("定时同步法院已交数据:数据id:"+id+",通知书号:"+payNoticeNo+"在已收信息表里不存在,插入成功");
UnitePayInfo record = new UnitePayInfo();
record.setUnitePayInfoId(id);
record.setBy2("1");// 已同步
record.setPushTime(time);// 同步时间
record.setUnitRespMsg("同步成功");// 返回报文
plusCjgPayInfoService.updateUnitePayInfoForSchedule(record);
logger.info("定时同步法院已交数据:数据id:"+id+",通知书号:"+payNoticeNo+"在已收信息表里不存在,插入成功,更新支付表状态成功");
}
} else {
// 再次切换回GDWSJF
MultipleDataSource.setDataSourceKey("dataSource");
logger.info("定时同步法院已交数据:数据id:"+id+",通知书号:"+payNoticeNo+"已收信息表里已存在,直接更新支付表状态为已同步");
UnitePayInfo record = new UnitePayInfo();
record.setUnitePayInfoId(id);
record.setBy2("1");// 已同步
record.setPushTime(time);// 同步时间
record.setUnitRespMsg("同步成功");// 返回报文
plusCjgPayInfoService.updateUnitePayInfoForSchedule(record);
}