mybatis 的动态数据源2

config包下

/*** 注入动态数据源*/
public class DynamicDataSource  extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSource();}
}
/*** 配置数据源并注入到 DynamicDataSource*/
@Configuration
public class DateSourceConfig {/*** yml 属性*/@Autowiredprivate Environment environment;@AutowiredUserMapper userMapper;@Bean@Primarypublic DataSource dynamicDataSource() {DynamicDataSource dynamicDataSource = new DynamicDataSource();Map<Object, Object> dataSourceMap = new HashMap<>(); //全部数据源// 可以循环读库加配置// masterDataSource master = buildDataSource(environment.getProperty("spring.datasource.dynamic.master.url"),environment.getProperty("spring.datasource.dynamic.master.username"),environment.getProperty("spring.datasource.dynamic.master.password"));// slaveDataSource slave = buildDataSource(environment.getProperty("spring.datasource.dynamic.slave.url"),environment.getProperty("spring.datasource.dynamic.slave.username"),environment.getProperty("spring.datasource.dynamic.slave.password"));// 添加全部数据源dataSourceMap.put("master", master);dataSourceMap.put("slave", slave);dynamicDataSource.setTargetDataSources(dataSourceMap);// 默认数据源dynamicDataSource.setDefaultTargetDataSource(master);return dynamicDataSource;}public static DataSource buildDataSource(String url, String username, String password) {HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName("com.mysql.jdbc.Driver");return dataSource;}
}
/*** 当前线程对应的数据源*/
public class DataSourceContextHolder {//此类提供线程局部变量。这些变量不同于它们的正常对应关系是每个线程访问一个线程(通过get、set方法),有自己的独立初始化变量的副本。private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSource(String dataSource) {contextHolder.set(dataSource);}public static String getDataSource() {return contextHolder.get();}public static void clearDataSource() {contextHolder.remove();}
}

aop包下

/*** 动态数据源注解*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DS {String value() default "master";
}
@Aspect
@Component
@Slf4j
public class DSAspect {@Pointcut("@annotation(com.my.config.aop.DS)")public void dataSourcePointcut(){}/*** 获取DS注解并设置 master 或 slave值 设置数据源* @param point* @return* @throws Throwable*/@Around("dataSourcePointcut()")public Object datasourceAround(ProceedingJoinPoint point) throws Throwable {MethodSignature signature = (MethodSignature)point.getSignature();Method method = signature.getMethod();DS ds = method.getAnnotation(DS.class);if (Objects.nonNull(ds)){DataSourceContextHolder.setDataSource(ds.value());}try {return point.proceed();} finally {DataSourceContextHolder.clearDataSource();}}
}

启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

yml

spring:datasource:dynamic:primary: master # 设置主数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl:  jdbc:mysql://localhost:3307/mybatisusername: rootpassword: phptsslave:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/mybatis_slaveusername: rootpassword: phpts

pom

 		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- mybatis起步依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源万能DIY预约小程序源码系统+自由DIY,海量模板任选择,附带完整的搭建教程

在移动互联网时代&#xff0c;用户对于预约服务的便捷性和高效性需求日益增长。为了满足这一需求&#xff0c;我们凭借多年的技术积累和经验&#xff0c;开发出了这款开源万能DIY预约小程序源码系统。该系统的推出旨在帮助开发者快速构建功能丰富、符合用户需求的预约小程序&am…

nginx配置及理解

nginx概述 nginx是一款自由的&#xff0c;开源的&#xff0c;高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP,POP3&#xff0c;SMTP代理服务器&#xff1b;nginx可以作为一个Http服务器进行网站的发布处理&#xff0c;另外nginx可以作为方向代理进行负载均衡…

[ CSS ] 内容超出容器后 以...省略

内容超出容器后 以…省略 当前效果 代码 <template><div class"box">有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚; 有心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴</div> </templa…

TechSmith Camtasia2024中文版简单好用的视频处理软件

TechSmith Camtasia 2024中文版是由techsmith公司推出的一款简单好用的视频处理软件&#xff0c;它集视频录制与视频后期处理为一体&#xff0c;用户可以使用软件来进行屏幕录制&#xff0c;其中包括了影像、音效、鼠标移动的轨迹、解说声音等任何模式下的电脑屏幕状态&#xf…

第二证券:煤炭板块震荡走高 潞安环能、晋控煤业涨超5%

证券时报网讯&#xff0c;煤炭板块27日盘中发力走高&#xff0c;到发稿&#xff0c;潞安环能、晋控煤业涨超5%&#xff0c;平煤股份、山西焦煤涨逾3%&#xff0c;恒源煤电、开滦股份等上扬。 职业方面&#xff0c;近期寒潮来袭&#xff0c;气温下降带动居民用电需求增加&#…

Mysql使用周期性计划任务定时备份,发现备份的文件都是空的?为什么?如何解决?

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

某生物科技巨头:引入安全工具,推动基因科技领域智能化发展

某生物科技巨头是生物科技领域的领导者&#xff0c;业务覆盖行业全产业链、全应用领域&#xff0c;是全球领先的科学技术服务提供商和精准医疗服务运营商。一直以来&#xff0c;该生物科技机构都致力于加速推动以基因科技为支撑的生命数字化建设&#xff0c;实现批量短基因快速…

小型内衣洗衣机什么牌子好?口碑最好的小型洗衣机

很多人会觉得内衣洗衣机是智商税&#xff0c;洗个内衣只需要两分钟的事情&#xff0c;需要花个几百块钱去入手一个洗衣机吗&#xff1f;然而清洗贴身衣物的并不是一件简单的事情&#xff0c;如果只是简单的搓洗&#xff0c;内裤上看不见的细菌也无法消除&#xff0c;而且对来生…

世岩清上:未来科技展览的策展视野

面对科技未来&#xff0c;策展视野的核心在于把握趋势&#xff0c;理解人性&#xff0c;并充分运用科技手段提升观众的体验。以下是我对未来科技展览的策展视野。 一、以人为本的设计理念 科技发展的最终目的是服务于人类&#xff0c;提升人们的生活质量。因此&#xff0c;展…

【Ambari】HDP单机自动化安装(基础环境和MySQL脚本一键安装)

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

04:2440---内存控制器

目录 一:介绍 1:引入 2:概念 3:通信 A:片选信号 B:片选信号的地址空间范围 ​​​​ 4:地址线 A:不同位数的接法 B:访问原理 C:访问地址 5:时序 1:NOR FLASH A:2440NOR FLASH时序 B:原理/时序图 C:寄存器 6:SDARM A:访问方式 B:原理图 C:BWSCON D:BANKCON…

海外Leads Generation产业:中国出海群体的行业大机会

Leads Generation&#xff08;简称LeadsGen&#xff09;指的是集中精力吸引和开发潜在客户的营销策略。通过引导式的营销策略&#xff0c;企业分发内容吸引潜在客户&#xff0c;引导客户留下电话/邮件/姓名等信息。基于这些信息&#xff0c;企业可建立潜在客户数据库&#xff0…

一文读懂:IOPS、延迟和吞吐量等存储性能指标

各位ICT的小伙伴们大家好呀&#xff0c; 在我们谈存储性能的时候&#xff0c;总会听到IOPS、延迟&#xff08;Latency&#xff09;、带宽&#xff08;Bandwidth&#xff09;、吞吐量&#xff08;Throughput&#xff09;以及响应时间&#xff08;Response Time&#xff09;等技…

AI智能外呼系统你了解多少

AI智能外呼系统是一种利用人工智能技术来帮助企业进行高效营销的工具。传统的营销方式往往需要人工打电话或发短信给客户&#xff0c;工作量大且效率低下。而使用ai外呼系统可以通过语音识别和自然语言生成技术&#xff0c;自动为客户提供服务、回答问题、进行推销等&#xff0…

持续集成部署-k8s-高级调度-CronJob:定时任务的应用

高级调度-CronJob&#xff1a;定时任务的应用 1. 简介2. Linux 上的 CronJob 定时任务3. 创建 K8s 的 CronJob4. 删除 k8s 的 CronJob 1. 简介 在 Kubernetes 中&#xff0c;CronJob 是一种用于创建定时任务的资源对象。它允许我们在集群中预定和运行定期的作业&#xff0c;类…

『Linux升级路』基础开发工具——make/Makefile

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识make/Makefile &#x1f4d2;1.1make/Makefile的优点 &#x1f4d2;…

EM32DX-C1【分布式io】

1设备类型&#xff1a; 电压&#xff1a;DC24V 输入16点 输出16点雷赛 EM32DX-C1 模块是一款基于 ASIC 技术的高性能、高可靠性的 CANopen 总线数字 量输入输出扩展模块&#xff0c;具有 16 路通用输入接口和 16 路通用输出接口。输入输出接口均采用光 电隔离和…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法&#xff0c;可以用于检测图像中的人行道-斑马线。在目标检测领域&#xff0c;YOLOv5通过结合多种技术手段&#xff0c;包括使用Mosaic数据增强操作、自适应锚框计算与…

SDN之Ubuntn20.04OpenDaylight控制器的安装

目录 1.OpenDaylight简介2.安装JAVA环境3.安装OpenDaylight4.问题总结 1.OpenDaylight简介 OpenDaylight&#xff08;ODL&#xff09;是一个开源的软件定义网络&#xff08;SDN&#xff09;控制器平台&#xff0c;提供了非常美观且功能完善的可视化管理界面&#xff0c;方便用…

15.解释Spring支持的几种bean的作用域

Spring支持的几种bean的作用域 Spring框架支持以下五种bean的作用域&#xff1a; singleton : bean在每个Spring ioc 容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。request&#xff1a;每次http请求都会创建一个bean&#xff0c;该作用域仅在基于…