type
status
date
slug
summary
tags
category
icon
password
ext
order
comment
环境
SpringBoot+SpringMVC+MyBatis Plus+Druid
思路
主要是利用AbstractRoutingDataSource动态切换数据源,AOP配合注解,在有数据源注解的方法执行的时候,根据注解值切换到对应的数据源,然后执行方法,前置通知或者环绕通知都可以。
开始配置
首先是配置下mysql数据源信息,在application.yml中的spring下的datasouce下的druid节点,如果有多个数据源直接写多个就行,比如我这里是dbAdmin和dbAnother
然后新建个配置文件DruidConfig,配置下过滤器,数据源,面板账户密码等等
新建一个枚举DataSourceEnum,有哪些数据源要切换,就写哪些
新建一个DataSourceContextHolder,内部用ThreadLocal保存当前数据源的key,和上面枚举的value对应
下面这个就很重要了,新建一个类继承自AbstractRoutingDataSource ,实现其方法determineCurrentLookupKey,就是从上面定义的DataSourceContextHolder中获取datasource的key
然后是MyBatis Plus的配置文件
新建个DataSource注解,作用于类或方法上,方便切换数据源,这里的默认值为DB_ADMIN
最后就是AOP切面的配置了,根据注解去切,我这里使用的环绕通知,为了注解作用于类上也可以,其下所有方法就用类上面的注解所配置的数据源,我里面先判断的方法是否有注解,其次才判断类的注解,所以方法注解的优先于类注解,可以在类上配置数据源1,在某些有需要的方法,单独配置数据源2即可。
使用
在需要的类或方法上添加注解
然后运行程序,调用对应方法, 如果成功的话,可以看到DataSourceAspect里会打印日志,如果没成功,请检查切面pointcut配置是否有问题,是否能切到。
待填坑
分布式事务
- 作者:Loneking
- 链接:https://loneking.cn/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/95
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。