1. 程式人生 > >spring+mybatis手動切換資料來源

spring+mybatis手動切換資料來源

最近在工作中遇到了一個專案要訪問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);
                    }