springboot多数据源根据开关控制方法访问的数据源

有个需求需要通过开关控制需要访问的数据源,此处参考DS多数据源,采用注解加aop切面实现此功能。

配置文件开关:

slave-config:mainSlaveSwitch: true

配置开关类:

@Component
@RefreshScope
@Data
@ConfigurationProperties("slave-config")
public class SlaveConfig {private boolean mainSlaveSwitch=false;
}

多数据源配置:

  datasource:dynamic:primary: masterdatasource:master:url: jdbc:mysql://xxxx:3306/order?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: gac_travel_devpassword: gac@6666driverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:initialSize: 10maxActive: 20minIdle: 5maxWait: 1000minEvictableIdleTimeMillis: 300000useGlobalDataSourceStat: truetimeBetweenEvictionRunsMillis: 60000validationQuery: select 'x'testOnBorrow: truetestOnReturn: truetestWhileIdle: trueslave:url: jdbc:mysql://xxxx:3306/order/gac_order?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: gac_dev_readpassword: gac@6666type: com.alibaba.druid.pool.DruidDataSourcedruid:initialSize: 10maxActive: 20minIdle: 5maxWait: 1000minEvictableIdleTimeMillis: 300000useGlobalDataSourceStat: truetimeBetweenEvictionRunsMillis: 60000validationQuery: select 'x'testOnBorrow: truetestOnReturn: truetestWhileIdle: truemainslave:url: jdbc:mysql://xxxx:3306/order/gac_order?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: gac_travel_testpassword: gac@6666type: com.alibaba.druid.pool.DruidDataSourcedruid:initialSize: 10maxActive: 20minIdle: 5maxWait: 1000minEvictableIdleTimeMillis: 300000useGlobalDataSourceStat: truetimeBetweenEvictionRunsMillis: 60000validationQuery: select 'x'testOnBorrow: truetestOnReturn: truetestWhileIdle: true

多数据源静态类(不是必须的):

public interface DBTypeConst {/*** 主库*/String MASTER = "master";/*** 主库的从库*/String MAIN_SLAVE = "mainslave";/*** 从库*/String SLAVE = "slave";}

多数据源注解:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DynamicDataSource {
}

AOP切面:

import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;@Aspect
@Component
@Slf4j
public class DynamicDataSourceAspect {@AutowiredSlaveConfig slaveConfig;@Around("@annotation(dynamicDataSource)")public Object switchDataSource(ProceedingJoinPoint joinPoint, DynamicDataSource dynamicDataSource) throws Throwable {if(slaveConfig.isMainSlaveSwitch()){log.info("DynamicDataSourceAspect:{}",DBTypeConst.MAIN_SLAVE);DynamicDataSourceContextHolder.push(DBTypeConst.MAIN_SLAVE);}else{log.info("DynamicDataSourceAspect:{}",DBTypeConst.SLAVE);DynamicDataSourceContextHolder.push(DBTypeConst.SLAVE);}try {return joinPoint.proceed();} finally {DynamicDataSourceContextHolder.clear();}}
}

此处使用时要多测试防止异常

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

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

相关文章

STM32 低功耗-睡眠模式

STM32 睡眠模式 文章目录 STM32 睡眠模式第1章 低功耗模式简介第2章 睡眠模式简介2.1 进入睡眠模式2.1 退出睡眠模式 第3章 睡眠模式代码示例总结 第1章 低功耗模式简介 在 STM32 的正常工作中,具有四种工作模式:运行、睡眠、停止和待机模式。 在系统或…

20. 有效的括号

20. 有效的括号 题目-简单难度示例1. if-else2. 优化3. 字典栈 题目-简单难度 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括…

动态规划之树形DP

动态规划之树形DP 树形DP何为树形DP 树形DP例题HDU-1520 Anniversary partyHDU-2196 Computer834. 树中距离之和 树形DP 何为树形DP 树形DP是指在“树”这种数据结构上进行的动态规划:给出一颗树,要求以最少的代价(或取得最大收益&#xff…

rust学习-构建服务器

单线程server 服务器会依次处理每一个请求,在完成第一个连接的处理之前不会处理第二个连接 // cat main.rs use std::io::prelude::*; use std::net::TcpListener; use std::net::TcpStream;fn main() {let listener TcpListener::bind("127.0.0.1:7878&quo…

uniapp app端 echarts 设置tooltip的formatter不生效问题以及解决办法

需求一: y轴数据处理不同数据增加不同单位 需求二: 自定义图表悬浮显示的内容 需求一:实现方式 在yAxis里面添加formatter yAxis: [{//y轴显示value的设置axisLabel: {show: true,formatter (value, index) > {var valueif (value > 1…

怎么让表格中的一行数据 转置 为一列数据 (WPS )

例如 我现在有一列数据 我想要 变成一行 数据 1.首先选中想要转置的数据,然后control C 2.接着 点击你想放置数据的位置 右键 其实 关键是 找到 选择性复制 3. 找到转置,勾选 最后 确定 反之亦然

linux快速安装mysql

linux快速安装mysql 安装之前检测系统是否有自带的MySQL #检查是否安装过MySQL rpm -qa | grep mysql #检查是否存在 mariadb 数据库(内置的MySQL数据库),有则强制删除 rpm -qa | grep mariadb #强制删除 rpm -e --nodeps mariadb-libs-5.5…

mysql的主键索引为什么不能null

mysql的主键索引为什么不能null 官方文档对null的描述再看官方文档对 primary key索引的说明这里的设计其实也是为了符合规范SQL1992题外话:唯一索引和null 这是一个非常奇怪且有趣的问题。可以通过官方文档进行解读 https://dev.mysql.com/doc/refman/5.7/en/gloss…

【Jmeter】 Report Dashboard 生成html图形测试报告

目录 背景 生成图形报告的方式 1、直接使用一个已存在的 CSV文件生成 2、负载测试完成后自动生成 使用示例 报告内容详情 测试报告摘要图 响应时间随时间变化曲线 活跃线程随时间变化曲线 I/O(Bytes)随时间变化曲线(忽略事务控制器示例结果) …

Web应急思路

Web应急思路 找到webshell --> 确定攻击者IP --> 回溯攻击者操作 --> 梳理整个攻击过程 1.寻找webshell方法 1.文件内容中的恶意函数 2.web日志中的webshell特征 3.贴合web业务中的URL来分析web日志 4.源码版本管理对比,注重修改或新增的脚本文件 5.统计…

有哪些开源和非开源的项目管理工具?

开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具: OpenProject:OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…

http和https的区别?(网络通讯)

HTTP: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种 网络协议 HTTPS: 是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。 两者区别: 1、HTTPS …

# Windows 环境下载 Android 12源码

前言 Android 官网(该方式不适合 Windows 平台):https://source.android.com/source/downloading.html (备注自 2021 年 6 月 22 日起,安卓操作系统不再支持在 Windows 或 MacOS 上进行构建,如果要编译源码推荐先安装…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

C#使用libmodbus库与工业设备进行读写测试

一.编译libmodbus库供C#使用 如何编译?请移步:https://blog.csdn.net/weixin_42205408/article/details/119530811 上面博主的文章除了所写的modbus.cs内的代码有点问题外(可能上面博主和我的Win 10 64位 Visual Studio 2019平台不一样吧&a…

如何在群晖nas中使用cpolar内网穿透?

如何在群晖nas中使用cpolar内网穿透 文章目录 如何在群晖nas中使用cpolar内网穿透 今天,我们来为大家介绍,如何在群晖系统中,使用图形化界面的cpolar。 cpolar经过图形化改造后,使用方法已经简便了很多,基本与其他应用…

为什么流程工业需要合适的预测性维护方案?

在当今工业中,预测性维护是一项至关重要的战略,它能够帮助企业预测设备故障并防止代价高昂的停机。然而,对于流程制造和离散制造来说,选择合适的预测性维护解决方案是至关重要的,因为这两类行业在设备运营和维护方面存…

redis缓存

1.什么是缓存 缓存就是数据交换的缓冲区,称为cache,是存储数据的临时地方,一般读写性能较高 典型例子就是在计算机的CPU和内存、磁盘。CPU的运算能力非常强大,运算速度已经远远超过内存或者磁盘读写数据的能力。但是先读到数据才…

【内网穿透】内网穿透应用场景

伴随着科学技术的进步,我们身边出现了越来越多的电子设备,特别是移动电子设备的普及,给我们的生活带来极大的便利,而软件技术的发展,更为这些软件设备带来更多应用的可能。虽然移动设备覆盖了了我们生活的绝大部分场景…

Mac 补丁管理

Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们,最后将它们推广到生产环境中进行部署来管理 macOS 端点,修补 Mac 设备(又称 Mac 修补)可增强 macOS 环境的安全级别。 什么是 m…