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");

浙公网安备 33010602011771号