当前位置: 首页 > news >正文

springboot配置多数据源

 springboot配置多数据源

学习新技术,争做新青年,欢迎围观,河南老乡在上海请,加,微,andyfau2022,

----获取数据源:null,数据源为null时默认使用主数据源的。

1-yml文件


spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:# 主库数据源master:url: jdbc:mysql:/306/andy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword:# 从库数据源slave:# 从数据源开关/默认关闭enabled: trueurl: jdbc:mysql/demo_project?useUnicode=true&characterEncodhavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: slave-aaa:# 从数据源开关/默认关闭enabled: true
#                driverClassName: org.postgresql.Driverurl: jdbc:mysql:/_databaseuseUnicode=true&characterEncoding=utf8&avior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: # 初始连接数initialSize: 5# 最小连接池数量minIdle: 10# 最大连接池数量maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置连接超时时间connectTimeout: 30000# 配置网络超时时间socketTimeout: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsewebStatFilter: enabled: truestatViewServlet:enabled: true# 设置白名单,不填则允许所有访问allow:url-pattern: /druid/*# 控制台管理用户名和密码login-username: Andy_Fan login-password: 123ss456filter:stat:enabled: true# 慢SQL记录log-slow-sql: trueslow-sql-millis: 1000merge-sql: truewall:config:multi-statement-allow: tr

2-DruidConfig 配置


/*** druid 配置多数据源** @author Andy_Fan** 在需要切换数据源的方法上加上@DataSource注解----加在serviceImpl方法上,或者mapper**    @DataSource(value = DataSourceType.SLAVE)*    @Select("select count(1) from public.\"LX_CJ_DK\"")*/
@Slf4j
@Configuration
public class DruidConfig
{/*** 主库数据源* @param druidProperties* @return*/@Bean@ConfigurationProperties("spring.datasource.druid.master")public DataSource masterDataSource( DruidProperties druidProperties ){log.info( "------主库数据源加载完成--masterDataSource-" );DruidDataSource dataSource = DruidDataSourceBuilder.create().build();return druidProperties.dataSource( dataSource );}/*** 从库数据源 1* @param druidProperties* @return*/@Bean@ConfigurationProperties("spring.datasource.druid.slave")@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")public DataSource slaveDataSource( DruidProperties druidProperties ){log.info( "------从库数据源加载完成--slaveDataSource-" );DruidDataSource dataSource = DruidDataSourceBuilder.create().build();return druidProperties.dataSource( dataSource );}/*** 从库数据源 2 aaa* @param* @return*/@Bean@ConfigurationProperties("spring.datasource.druid.slave-aaa")@ConditionalOnProperty(prefix = "spring.datasource.druid.slave-aaa", name = "enabled", havingValue = "true")public DataSource slaveAAADataSource( DruidProperties druidProperties ){log.info( "------从库数据源加载完成--slaveAAADataSource-" );DruidDataSource dataSource = DruidDataSourceBuilder.create().build();return druidProperties.dataSource( dataSource );}@Bean(name = "dynamicDataSource")@Primarypublic DynamicDataSource dataSource( DataSource masterDataSource, DataSource slaveDataSource, DataSource slaveAAADataSource ){log.info( "------主从数据源加载完成---" );Map< Object, Object > targetDataSources = new HashMap<>();targetDataSources.put( DataSourceType.MASTER.name(), masterDataSource );targetDataSources.put( DataSourceType.SLAVE.name(), slaveDataSource );targetDataSources.put( DataSourceType.SLAVE_AAA.name(), slaveAAADataSource );//        在需要切换数据源的方法上加上@DataSource注解,@DataSource(value = DataSourceType.SLAVE)return new DynamicDataSource( masterDataSource, targetDataSources );}/*** 设置数据源** @param targetDataSources 备选数据源集合* @param sourceName 数据源名称* @param beanName bean名称*/public void setDataSource( Map< Object, Object > targetDataSources, String sourceName, String beanName ){try{log.info( "------加载数据源: targetDataSources{}", targetDataSources + "------: sourceName {}", sourceName + "------: beanName{}", beanName );DataSource dataSource = SpringUtils.getBean( beanName );targetDataSources.put( sourceName, dataSource );}catch ( Exception e ){log.error( "------加载数据源失败, {}", e.getMessage() );}}
}

3- DynamicDataSource

``` 

/*** 动态数据源** @author Andy_Fan* @date 2024/09/11*/
@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource
{public DynamicDataSource( DataSource defaultTargetDataSource, Map< Object, Object > targetDataSources ){log.info( "-----------DynamicDataSource init" );super.setDefaultTargetDataSource( defaultTargetDataSource );super.setTargetDataSources( targetDataSources );super.afterPropertiesSet();}@Overrideprotected Object determineCurrentLookupKey(){log.info( "------DynamicDataSource determineCurrentLookupKey" );return DynamicDataSourceContextHolder.getDataSourceType();}
}

4-DynamicDataSourceContext


/*** 数据源切换处理* @author Andy_Fan* @date 2024/09/11*/
public class DynamicDataSourceContextHolder
{public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);/*** 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。*/private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();/*** 设置数据源的变量** 增加DataSourceType类里面的枚举类型public enum DataSourceType{MASTER,SLAVE,SLAVE_XZDB}**/public static void setDataSourceType(String dsType){log.info("----切换数据源:", dsType);CONTEXT_HOLDER.set(dsType);}/*** 获得数据源的变量*/public static String getDataSourceType(){log.info("-----获取数据源:{}", CONTEXT_HOLDER.get());return CONTEXT_HOLDER.get();}/*** 清空数据源变量*/public static void clearDataSourceType(){log.info("-----清除数据源");CONTEXT_HOLDER.remove();}}

5-测试


/*** <p>* 用户表 服务实现类* </p>** @author Andy_Fan* @since 2024-09-12 14:52:06*/
@Service
public class DemoUserServiceImpl extends ServiceImpl< DemoUserMapper, DemoUser > implements IDemoUserService
{@Resourceprivate DemoUserMapper demoUserMapper;@Override@DataSource(value = DataSourceType.SLAVE)public List< DemoUser > selectList(){return demoUserMapper.selectAll( new DemoUser() );}}

----切换到SLAVE数据源

-----获取数据源:SLAVE

----获取数据源:null

.r.f.d.DynamicDataSourceContextHolder - [setDataSourceType,28] - ----切换到SLAVE数据源
15:52:06.280 [http-nio-8080-exec-1] INFO  c.r.f.d.DynamicDataSourceContextHolder - [getDataSourceType,38] - -----获取数据源:SLAVE
15:52:06.283 [http-nio-8080-exec-1] DEBUG c.r.d.m.D.selectAll - [debug,135] - ==>  Preparing: select id, username, password, nickName, third_party_id, avatar, avatar_thumbnail, gender, user_type, last_login_time, registration_ip, deleted, version, create_date, create_by, update_date, update_by from demo_user
15:52:06.289 [http-nio-8080-exec-1] DEBUG c.r.d.m.D.selectAll - [debug,135] - ==> Parameters: 
15:52:06.429 [http-nio-8080-exec-1] DEBUG c.r.d.m.D.selectAll - [debug,135] - <==      Total: 2
15:52:06.430 [http-nio-8080-exec-1] INFO  c.r.f.d.DynamicDataSourceContextHolder - [clearDataSourceType,47] - -----清除数据源

一起加油,一起向前冲。。。

相关文章:

springboot配置多数据源

springboot配置多数据源 学习新技术&#xff0c;争做新青年&#xff0c;欢迎围观&#xff0c;河南老乡在上海请&#xff0c;加&#xff0c;微&#xff0c;andyfau2022&#xff0c; ----获取数据源&#xff1a;null&#xff0c;数据源为null时默认使用主数据源的。 1-yml文件…...

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题&#xff1a;墙体两侧特征混淆误匹配&#xff0c;导致建图和定位偏差&#xff0c;表现为过门跳变、外月台走歪等 解决思路&#xff1a;预期的根治方案IGICP需要较长时间完成上线&#xff0c;先使用切分地图的工程化方案&#xff0c;即墙体两侧切…...

ChatGPT+Simple Mind Map生成思维导图:快速提升学习效率

一、告别杂乱笔记&#xff0c;一键生成清晰思维导图&#xff01; 最近开始学习网络安全&#xff0c;一头扎进了各种协议、漏洞、防御机制的海洋中。信息量巨大&#xff0c;知识点零散&#xff0c;让我很快便陷入了“知识焦虑”——笔记越记越多&#xff0c;却越来越混乱&#…...

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式&#xff1a;3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制&#xff1a;Maven & SpringBoot 多环境兼容 配置文件分类&#xff1a;4种 整合…...

Wordpress右下角表单弹出插件

Ultimate Sticky Popup & Widgets Charcoal Making Machine | Equipment for Sale - Kingtiger...

影刀RPA实战:自动化批量生成条形码完整指南

今天我们聊聊使用影刀来实现批量生成条形码&#xff0c;条形码在零售行业运用非常广泛&#xff0c;主要作用表现在产品识别&#xff0c;库存管理&#xff0c;销售管理&#xff0c;防伪保护等&#xff0c;这些作用使其成为现代商业和工业环境中不可或缺的工具&#xff0c;它极大…...

Python Flask简介

简介 Flask 有两个主要依赖&#xff1a;路由、调试和 Web 服务器网关接口&#xff08;Web Server Gateway Interface&#xff0c;WSGI&#xff09; 子系统由&#xff1a;Werkzeug 提供模板系统由&#xff1a;Jinja2提供Werkzeug 和 Jinjia2 都是由 Flask 的核心开发者开发而成…...

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践

随着科技的飞速发展&#xff0c;视频监控平台在社会安全、企业管理、智慧城市构建等领域发挥着越来越重要的作用。一个高效的视频监控平台&#xff0c;不仅依赖于先进的硬件设备&#xff0c;更离不开强大的视频处理技术作为支撑。这些平台集成了多种先进的视频技术&#xff0c;…...

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录&#xff0c;创建docker-ce.repo文件 [rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源&#xff0c;镜像源在编辑中需要单独复制 h…...

pcs升压变流一体机

在当今全球积极推进能源转型的大背景下&#xff0c;新能源技术的发展日新月异。其中&#xff0c;PCS 升压变流一体机作为一种关键的能源转换设备&#xff0c;正发挥着越来越重要的作用。它一般可分为10KV与35KV等级的。 PCS 升压变流一体机&#xff0c;全称为 Power Conversion…...

上海泗博EtherNet/IP转PROFIBUS DP网关EPS-320IP成都地铁项目应用案例

背景&#xff1a; 地铁&#xff0c;作为城市的活力脉搏&#xff0c;不仅是衔接城市生活的关键纽带&#xff0c;更是现代城市交通体系中不可或缺的核心组成部分。因此&#xff0c;确保地铁的稳定运行对任何一座城市都至关重要。 上海泗博自动化&#xff0c;作为与成都地铁项目合…...

猫鼠游戏: KaijiK病毒入侵溯源分析

1. 事件背景 近期&#xff0c;网宿平台某客户在使用云主机工作的时候突然出现主机卡顿&#xff0c;连接不稳定&#xff0c;网络断开的情况&#xff0c;并且收到了网宿主机入侵检测产品的告警信息。由于客户没有专职的安全人员&#xff0c;由运维人员兼任安全运营工作&#xff…...

【Hot100算法刷题集】双指针-02-盛水最多的容器(含暴力枚举、双指针法及其合理性证明)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的…...

Spring和Spring FrameWork有什么关系?两者是同一个东西吗?

Spring和Spring Framework之间的关系可以归结为以下几点&#xff1a; 广义与狭义的理解 广义上的Spring&#xff1a; 广义上的Spring泛指以Spring Framework为基础的整个Spring技术栈。Spring已经发展成为一个由多个不同子项目&#xff08;模块&#xff09;组成的成熟技术体系…...

windows10 python 解决鼠标右键菜单中没有Edit with IDLE(不使用注册表编辑器)

随便选择一个py文件&#xff0c;右击打开属性。 打开方式&#xff1a;点击更改。 最下面&#xff1a;点击更多应用&#xff0c;点击在这台电脑上查找应用 搜索找到你自己按照的python路径下 Python39\Lib\idlelib\idle.bat 文件 点击打开&#xff0c;结束。...

一些深度学习相关指令

// 服务器上查看所有的环境版本 conda env list// 删除某一个环境 conda remove -n 环境名 --all终端输入命令&#xff1a;nvidia-smi&#xff0c;可以看显卡的使用情况指定使用哪张显卡&#xff1a; os.environ["CUDA_VISIBLE_DEVICES"] 2查看服务器的cuda版本&am…...

Python 实现自动配置华为交换机

Python 实现自动配置华为交换机 在网络运维中&#xff0c;配置交换机是非常重要的一步。如果我们可以使用 Python 来实现配置交换机&#xff0c;那么我们的工作效率将会大大提高。在本文中&#xff0c;我们将学习如何使用 Python 配置华为交换机。 背景知识 华为交换机是一种…...

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…...

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型程序设计参考资料致谢预测效果 Matlab实现PSO-LSTM多变量回归…...

Linux seq命令

参考资料 知っておくとちょっと便利&#xff01;seq コマンドの使い方をご紹介 目录 一. 基本语法二. 选项2.1 -f 格式化输出2.2 -s 指定分隔符2.3 -w 输出数字补齐宽度 三. 小案例3.1 递减序列3.2 批量创建测试文件3.3 批量下载文件 一. 基本语法 seq [OPTION] 结束值 seq […...

CodeWF Toolbox:一个用 Avalonia + Prism 做出来的开发者工具箱

今天这篇文章&#xff0c;站长来聊聊我自己开发的 CodeWF Toolbox&#xff0c;CodeWF 工具箱。熟悉我的朋友一般都叫我“站长”&#xff0c;因为我还有一个网站&#xff1a;CodeWF。这个工具箱也是围绕我平时写代码、维护网站、整理资料、排查问题时反复遇到的需求做出来的。它…...

7B秒杀70B!大模型微调秘籍全解:从理论到实战,玩转高效适配!

本文系统介绍了大模型微调的理论框架与实践流程。阐述了微调的必要性&#xff0c;即弥补通用大模型在领域知识、输出格式及行为对齐上的不足&#xff0c;并说明微调效果可超越更大参数的未微调模型。文章深入解析了微调原理&#xff0c;对比了全参数微调与高效微调&#xff08;…...

Windows HEIC缩略图插件:为什么你的iPhone照片在Windows上无法预览?

Windows HEIC缩略图插件&#xff1a;为什么你的iPhone照片在Windows上无法预览&#xff1f; 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumb…...

德勤预计机器人投资将在2026年增长的地方

尽管德勤预测到2026年全球⼯业机器⼈基数可能达到550万个&#xff0c;但也承认“⾃2021年以来&#xff0c;年度新机器⼈销量停滞在50万台以上。”为了满⾜以⼈⼝统计为驱动的需求&#xff0c;技术⽣态系统必须解决与数据质量、集成和安全性相关的瓶颈&#xff0c;公司强调“⽬前…...

告别UUID!用Apache Commons Lang3的RandomStringUtils生成更灵活的随机字符串(Java实战)

告别UUID&#xff01;用Apache Commons Lang3的RandomStringUtils生成更灵活的随机字符串&#xff08;Java实战&#xff09; 在Java开发中&#xff0c;生成随机字符串的需求无处不在——从用户邀请码、临时密码到订单编号&#xff0c;我们经常需要快速生成一串既随机又可读的字…...

Translumo:5分钟掌握Windows实时屏幕翻译神器的完整指南

Translumo&#xff1a;5分钟掌握Windows实时屏幕翻译神器的完整指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否…...

Cyber Engine Tweaks终极指南:3步解锁赛博朋克2077的完整定制体验

Cyber Engine Tweaks终极指南&#xff1a;3步解锁赛博朋克2077的完整定制体验 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks 你是否想让《赛博朋克2077》运…...

智能服装开发实战:基于NeoPixel与Arduino的动态光效设计与实现

1. 项目概述&#xff1a;打造一件会“流动”的智能光效裙几年前&#xff0c;当我第一次看到Phil Burgess的“Ooze Master 3000”代码时&#xff0c;就被那个模拟粘稠液体缓慢滴落的灯光动画迷住了。它不像普通的彩虹轮转那么直白&#xff0c;而是有一种有机的、近乎生物感的动态…...

2026届学术党必备的六大AI写作神器实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 从事学术研究范畴内&#xff0c;撰写论文常常要消耗大量的时间以及精力&#xff0c;诸多的学…...

[2026最新版] 保姆级 Burp Suite 安装教程

在Windows上安装教程如下&#xff1a; 文件下载&#xff1a;点我下载&#xff08;NAS分享链接&#xff0c;若链接过期或无法下载&#xff0c;请联系作者&#xff1a;zeyun4699gmail.com&#xff09; 步骤一&#xff1a;下载来自我上传的文件&#xff08;你会得到步骤二的图片…...