baomidou中怎么利用dynamic-datasource实现读写分离
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章给大家介绍baomidou中怎么利用dynamic-datasource实现读写分离,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。maven
千家信息网最后更新 2025年12月02日baomidou中怎么利用dynamic-datasource实现读写分离
这篇文章给大家介绍baomidou中怎么利用dynamic-datasource实现读写分离,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
maven
com.baomidou dynamic-datasource-spring-boot-starter 2.5.7
纯读写分离(mybatis环境)
场景:
在纯的读写分离环境,写操作全部是master,读操作全部是slave。
不想通过注解配置完成以上功能。
答:在mybatis环境下可以基于mybatis插件结合本数据源完成以上功能。 手动注入插件。
@Beanpublic MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){ return new MasterSlaveAutoRoutingPlugin();}默认主库名称master,从库名称slave。
问题
我在配置好了之后,调试发现对数据库读的操作不得进入MasterSlaveAutoRoutingPlugin,而且进入了默认的库。只有写进入了MasterSlaveAutoRoutingPlugin中。当然也可以默认为从库,但是感觉就不是很好。
于是我自定义了一个aop切面来,来完成库的选择,代码如下:
import java.lang.reflect.Method;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.context.annotation.Lazy;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;import com.baomidou.dynamic.datasource.annotation.DS;import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;import lombok.extern.java.Log;/** * Copyright: Copyright (c) 2019 *说明:动态数据源配置
* * @version: V1.0 * @author: BianPeng * */@Aspect@Component@Order(0)@Lazy(false)@Logpublic class DataSourceAop{ private static final String MASTER = "master"; private static final String SLAVE = "slave"; @Pointcut("execution(* com.buybit.power.service..*.*(..)) || execution(* com.baomidou.mybatisplus.extension.service..*.*(..))") public void checkArgs() { } // 这里切到你的方法目录 @Before("checkArgs()") public void process(JoinPoint joinPoint) throws NoSuchMethodException, SecurityException { String methodName = joinPoint.getSignature().getName(); if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find") || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check") || methodName.startsWith("page")) { log.info("当前执行的库:"+SLAVE); DynamicDataSourceContextHolder.push(SLAVE); } else { log.info("当前执行的库:"+MASTER); DynamicDataSourceContextHolder.push(MASTER); } } @After("checkArgs()") public void afterAdvice(){ DynamicDataSourceContextHolder.clear(); }}
但是发现,baomidou/dynamic-datasource自带的@DS没失去了着用,于是我把有@DS的类和方法排除掉,代码入下:
import java.lang.reflect.Method;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.context.annotation.Lazy;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;import com.baomidou.dynamic.datasource.annotation.DS;import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;import lombok.extern.java.Log;/** * Copyright: Copyright (c) 2019 *说明:动态数据源配置
* * @version: V1.0 * @author: BianPeng * */@Aspect@Component@Order(0)@Lazy(false)@Logpublic class DataSourceAop{ private static final String MASTER = "master"; private static final String SLAVE = "slave"; @Pointcut("execution(* com.buybit.power.service..*.*(..)) || execution(* com.baomidou.mybatisplus.extension.service..*.*(..))") public void checkArgs() { } // 这里切到你的方法目录 @Before("checkArgs()") public void process(JoinPoint joinPoint) throws NoSuchMethodException, SecurityException { String methodName = joinPoint.getSignature().getName(); Class clazz = joinPoint.getTarget().getClass(); if(clazz.isAnnotationPresent(DS.class)){ //获取类上注解 return; } String targetName = clazz.getSimpleName(); Class[] parameterTypes = ((MethodSignature)joinPoint.getSignature()).getMethod().getParameterTypes(); Method methdo = clazz.getMethod(methodName,parameterTypes); if (methdo.isAnnotationPresent(DS.class)) { return; } if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find") || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check") || methodName.startsWith("page")) { log.info("当前执行的库:"+SLAVE); DynamicDataSourceContextHolder.push(SLAVE); } else { log.info("当前执行的库:"+MASTER); DynamicDataSourceContextHolder.push(MASTER); } } @After("checkArgs()") public void afterAdvice(){ DynamicDataSourceContextHolder.clear(); }}
关于baomidou中怎么利用dynamic-datasource实现读写分离就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
数据
配置
数据源
方法
环境
代码
内容
功能
动态
名称
插件
更多
注解
目录
帮助
不错
兴趣
切面
只有
场景
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
杭州仟金顶网络技术
应聘网络技术自我陈述
在哪修改安全接入服务器
牧云阁互联网科技有限公司
arcmap连接数据库没有权限
微机课软件开发网址
关于农业技术的数据库
怎么启动服务器
实惠的联想ts250服务器
信息与网络安全部电话
百度网络技术扣费
用友服务器
山东前端软件开发机构
网络安全广州
达梦数据库启动服务后端口没打开
湖北的软件开发
宜昌软件开发方案
数据库优化推荐
网络安全 测试环境
建设综合风险基础数据库
设置内网共享数据库
网络技术题南开
视频服务器显示心跳丢失
抓网络安全建设
手机学习网络技术的软件
接入层网络安全问题有哪些
大学二级学院网络安全责任制细则
数据库表结构转化为实体
河南中考服务平台服务器错误
服务器双网口做级联