spring+mybatis手動切換資料來源
阿新 • • 發佈:2018-12-12
最近在工作中遇到了一個專案要訪問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); }