Spring+Mybatis多数据源切换

spring 基础配置

<bean id="dataSource"
        class="com.zmeng.rinascimento.caravaggio.common.util.datasource.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="app" value-ref="app"></entry>
                <entry key="union" value-ref="union"></entry>
                <entry key="sdk" value-ref="sdk"></entry>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="app" /> <!-- 默认数据源 -->
    </bean>

数据源配置

app.jdbc.url=jdbc:mysql://jdbc1?useUnicode=true&characterEncoding=UTF-8
app.jdbc.username=work
app.jdbc.password=t8KWyBFnjyMTSeKZKBeVwNgGW5hz2CYE

union.jdbc.driverClassName=/jdbc2?useUnicode=true&characterEncoding=UTF-8
union.jdbc.username=LTAIeLVe8Hx1x244
union.jdbc.password=cgJDPYGAdVKguBx7sB3QIt1j3PSv3u

sdk.jdbc.url=jdbc:mysql:///jdbc3?useUnicode=true&characterEncoding=UTF-8
sdk.jdbc.username=work
sdk.jdbc.password=K5IJJBtLxRoLBbuLaA

新建DynamicDataSourceHolder具体执行数据源切换

public class DynamicDataSourceHolder {
     /**
     * 注意:数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰
     */
    private static final ThreadLocal<String> THREAD_DATA_SOURCE = new ThreadLocal<String>();

    public static String getDataSource() {
        return THREAD_DATA_SOURCE.get();
    }

    public static void setDataSource(String dataSource) {
        THREAD_DATA_SOURCE.set(dataSource);
    }

    public static void clearDataSource() {
        THREAD_DATA_SOURCE.remove();
    }
}

新建DynamicDataSource继承AbstractRoutingDataSource

public class DynamicDataSource extends AbstractRoutingDataSource  {

    /**
     * override determineCurrentLookupKey
     * Description: 自动查找datasource
     */
    @Override
    protected Object determineCurrentLookupKey() {
        //从自定义的位置获取数据源标识
         return DynamicDataSourceHolder.getDataSource();
    }
    

}

配置切面

@Aspect
@Component
public class DateSourceInterceptor {
    
    @Pointcut("execution(* com.zmeng.rinascimento.caravaggio.service.*.*(..))")
    public void dataService() {
    };

    @Around("dataService()")
    public Object filtedValid(ProceedingJoinPoint jp) throws Throwable {
        String className = jp.getTarget().getClass().getSimpleName();
        if(Constants.dataMap.containsKey(className)) {
            DynamicDataSourceHolder.setDataSource(Constants.dataMap.get(className));
        } else {
            DynamicDataSourceHolder.setDataSource("app");
        }
        return jp.proceed();
    }

}

 

public static final Map<String,String> dataMap = new HashMap<String,String>() {
        private static final long serialVersionUID = 34561903L;
        {
            put("SdkAppServiceImpl","sdk");put("SdkCproServiceImpl","sdk");
            put("SdkStrategyImpl","sdk");
        }
    };

手动切换数据源

    在service层具体调用接口前,切换数据源

 DynamicDataSourceHolder.setDataSource("union");

 

posted @ 2019-10-14 20:21  javaeelwh  阅读(102)  评论(0)    收藏  举报