mybatisplus @DS怎么实现动态切换数据源
导读:本文共3932.5字符,通常情况下阅读需要13分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1、mybatis-plus @DS实现动态切换数据源原理首先mybatis-plus使用com.baomidou.dynamic.datasource.AbstractRoutingDataSource继承 AbstractDataSource接管数据源;具体实现类为com.baomidou.dynamic.datasource.DynamicRoutingD... ...
目录
(为您整理了一些要点),点击可以直达。首先mybatis-plus使用com.baomidou.dynamic.datasource.AbstractRoutingDataSource继承 AbstractDataSource接管数据源;具体实现类为com.baomidou.dynamic.datasource.DynamicRoutingDataSource。项目初始化调用public synchronized void addDataSource(String ds, DataSource dataSource)加载数据源,数据源存进dataSourceMap中。
private Map<String, DataSource> dataSourceMap = new LinkedHashMap<>();
进行数据操作时,方法会被com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor拦截,
拦截器首先从被拦截的方法或者类(一般@DS注解用于Service,也可用于Mapper和Controller)上寻找@DS注解,获取到@DS注解的值后将其存入com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;DynamicDataSourceContextHolder使用ThreadLocal存储当前线程的数据源名。
进行数据操作时,会调用org.springframework.jdbc.datasource.getConnection()方法;getConnection()方法最终调用了com.baomidou.dynamic.datasource.AbstractRoutingDataSource的getConnection()方法;
determineDataSource()由子类com.baomidou.dynamic.datasource.DynamicRoutingDataSource实现,可以看到DynamicRoutingDataSource从DynamicDataSourceContextHolder获取数据源名称,这个在之前拦截器处理存进ThreadLocal中,如果有数据源名称则从dataSourceMap中获取,没有则获取默认的primary数据源。
此时的数据源已经切换成了我们需要的数据源。
数据操作完成后,方法返回第二步中的拦截器,执行DynamicDataSourceContextHolder.poll();清除掉此次的数据源,避免影响后续数据操作。
附上动态数据源相关配置
pom.xml
相应类
**注意:**不可在事务中切换数据库,保证事务需要方法使用同一连接,使用@DS(dataSource1)方法调用@DS(dataSource2)无法切换连接,会导致方法报错。
mybatisplus @DS怎么实现动态切换数据源的详细内容,希望对您有所帮助,信息来源于网络。