mybatis手动切换数据库_mybatis动态切换数据源

这篇博客介绍了如何在业务需求下实现MyBatis数据源的动态切换,避免为每个数据源创建单独的Mapper。文章讲解了AbstractRoutingDataSource的工作原理,并通过ThreadLocal确保线程安全,提供了一个简单的DynamicDataSource实现。同时,利用Spring AOP在方法执行前动态设置数据源,使得在调用特定服务时可以切换到相应数据源。
摘要由CSDN通过智能技术生成

(#)背景:由于业务的需求,导致需要随时切换15个数据源,此时不能low逼的去写十几个mapper,所以想到了实现一个数据源的动态切换

首先要想重写多数据源,那么你应该理解数据源的一个概念是什么,DataSourceTransactionManager这个类就是spring中对于数据源的封装,其中DataSource做为

他的一个成员.接下来我们要介绍一下我们切换动态数据源需要使用的类,AbstractRoutingDataSource,先来看看这个类的源码

首先看看这几个变量,targetDataSources代表的就是备选的数据源了,用一个map存储,显然是为了在关键的时候快速的查找这些数据源,defaultTargetDataSource

就是我们在配置的时候一般都会制定一个默认的数据源就是它了,

程序运行的时候在加载配置文件的时候,首先会执行setTargetDataSources方法,这个方法会加载配置文件中配置的数据源,存储在上面说的targetDataSource中,

然后是设置setDefaultTergetDataSource,这个就是上面说的默认的数据源,

接下来会执行这个方法,在其中会将所有的数据源用来初始化resolvedDataSources,而当实际上和数据库产生交互的时候那么会调用到下面的方法:

如果看到这里大概你也知道怎么回事了,在我们实际和数据库产生交互的时候那么就需要使用到数据源了,那么这个时候我们只是需要重写这determineCurrentLookupKey

方法,而用这个方法具体干了什么呢?就是用它来寻找数据源啊,也就是说我们在mapper中的配置:

(#)下面看看代码上怎么来写

首先为了线程安全我们使用一个ThreadLocal来做存储

public class ContextHolder {

public static final String DATASOURCE_1="dataSource";

public static final String DATASOURCE_2="dataSource2";

private static final ThreadLocal context = new ThreadLocal();

public static void setConsumerType(String consumerType){

context.set(consumerType);

}

public static String getConsumerType(){

return context.get();

}

public static void clearConsumerType(){

context.remove();

}

}

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return ContextHolder.getConsumerType();

}

}

其实剩下的怎么实现已经很简单了,基本思路就是使用一个动态代理,在执行这个方法的时候,我们动态的给ContextHoler设置值,我建议使用spring aop,或者如果

不是spring的项目,那么直接只用动态代理也是很好的我觉,下面贴出一些我的简陋的代码

@Aspect

@Component

public class DataSourceAspect {

@Pointcut("execution(* com.wang.route.DynamicPersonService.*(..))")

public void pointCut() {

}

@Before(value = "pointCut()")

public void before(JoinPoint joinPoint) {

ContextHolder.setConsumerTyp(“”);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值