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

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录

  • 前言
  • 一、引入依赖
  • 二、创建一个light-db_1备用数据库
  • 三、配置文件 application-dev.yml
  • 四、创建shardingsphere-config.yml
    • 完整项目结构
  • 五、测试
  • 总结


前言

在现代化微服务架构中,随着数据量的不断增长,单一数据库已难以满足高可用性、扩展性和性能要求。ShardingSphere 提供了分库分表的能力,帮助我们轻松实现水平拆分。本文将介绍如何在 Spring Boot 项目中,结合 MyBatisDruid,实现分库分表的功能。


提示:以下是本篇文章正文内容,下面案例可供参考

一、引入依赖

在父项目中引入shardingsphere-jdbc依赖

 dependencies {...implementation 'com.alibaba:druid-spring-boot-3-starter:1.2.24'implementation 'com.mysql:mysql-connector-j:9.2.0'implementation 'org.apache.shardingsphere:shardingsphere-jdbc:5.5.2'}

二、创建一个light-db_1备用数据库

创建一个light-db_1作为分库,表结构和light-db一模一样

三、配置文件 application-dev.yml

上篇文章介绍使用mybatis+druid的时候是直接在datasource下配置了数据库连接参数,这里我们将数据库配置文件放在单独的shardingsphere-config.yml专门进行分库分表的配置

spring:datasource:url: jdbc:shardingsphere:classpath:shardingsphere-config.ymldriver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriverdruid:initial-size: 5min-idle: 10max-active: 20validation-query: SELECT 1filters: stat,slf4j# 统计 SQL 执行情况stat:merge-sql: truelog-slow-sql: trueslow-sql-millis: 5000web-stat-filter:#不统计这些请求数据exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"#访问监控网页的登录用户名和密码stat-view-servlet:enabled: trueurl-pattern: /druid/*login-username: light-druidlogin-password: light-druid# MyBatis
mybatis:# 搜索指定包别名type-aliases-package: com.light.**.entity# 配置mapper的扫描,找到所有的mapper.xml映射文件mapper-locations: classpath*:mapper/**/*Mapper.xml# 加载全局的配置文件configLocation: classpath:mybatis-config.xmllogging:level:org.mybatis: debugcom.light.generator.mapper: debug

四、创建shardingsphere-config.yml

在该配置文件中配置分库分表,配置参数参考注释,完整的配置示例请参考官网ShardingSphere-JDBC配置说明

# ShardingSphere 配置模式,配置为 Standalone(独立模式)
mode:type: Standalonerepository:type: JDBC # 使用 JDBC 作为注册中心,支持通过数据库持久化配置# 配置多个数据源 ds_0 和 ds_1
dataSources:# 数据源 ds_0 配置ds_0:dataSourceClassName: com.alibaba.druid.pool.DruidDataSource  # 使用 Druid 数据源连接池driverClassName: com.mysql.cj.jdbc.Driver  # MySQL 驱动类url: jdbc:mysql://localhost:3306/light-db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false# 数据库连接 URL,配置了字符编码、时区、是否使用 SSLusername: root  # 数据库用户名password: 123456  # 数据库密码# 数据源 ds_1 配置ds_1:dataSourceClassName: com.alibaba.druid.pool.DruidDataSource  # 使用 Druid 数据源连接池driverClassName: com.mysql.cj.jdbc.Driver  # MySQL 驱动类url: jdbc:mysql://localhost:3306/light-db_1?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false# 数据库连接 URL,配置了字符编码、时区、是否使用 SSLusername: root  # 数据库用户名password: 123456  # 数据库密码# ShardingSphere 的分片规则
rules:- !SHARDING  # 启用分片规则tables:t_user:# 配置 t_user 表的分片规则actualDataNodes: ds_${0..1}.t_user  # 定义表的实际数据节点,ds_0 和 ds_1 分别表示两个数据源databaseStrategy:standard:# 配置数据库的分片策略shardingColumn: id  # 使用 id 列作为分片字段shardingAlgorithmName: database_inline  # 使用 INLINE 算法进行分片keyGenerateStrategy:# 配置主键生成策略column: id  # 主键列为 idkeyGeneratorName: snowflake  # 使用 Snowflake 算法生成主键# 配置分库算法shardingAlgorithms:database_inline:type: INLINE  # 使用 INLINE 算法props:algorithm-expression: ds_${id % 2}  # 分库算法,根据 id 字段的值做取余运算,分配到 ds_0 或 ds_1 数据源# 配置主键生成算法keyGenerators:snowflake:type: SNOWFLAKE  # 使用 Snowflake 算法生成全局唯一的 IDprops:worker-id: 123  # 配置 Snowflake 算法的工作机器 ID,用于生成唯一的 ID# 配置一些全局属性
props:sql-show: true  # 是否显示 SQL 执行日志,设置为 true 时会在日志中输出 SQL

完整项目结构

在这里插入图片描述

五、测试

在此通过insertUsergetUserList进行测试,具体测试代码请参考我的前章节内容 八.springboot集成mybatis+druid数据库连接池

  • 测试新增用户
    在这里插入图片描述
  • 测试查询
    在这里插入图片描述
    此时查看2个数据库中就能看到刚刚测试添加的数据了

总结

在这篇实践中,我们使用了 ShardingSphere 配合 MyBatisDruid 实现了分库分表的功能。通过配置,我们定义了分库分表策略、数据源。结合 MyBatis,我们可以在服务层进行 CRUD 操作,轻松管理数据。

这种方式不仅提高了数据库的性能,还确保了数据的可扩展性,适用于大规模系统的构建。如果你有任何问题,欢迎在评论区留言。

ShardingSphere还有很多其他功能,比如数据加密、影子库、数据脱敏、读写分离等,具体说明请参考ShardingSphere官网介绍

相关文章:

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中,随着数据量的不断增长,单一数据库已难以满足高可用性、扩展性和…...

大数据治理:构建数据驱动的未来基石

一、大数据治理的定义与核心价值 在大数据战略从顶层设计到底层实现的落地过程中,数据治理是基础,技术是承载,分析是手段,应用是目的。与传统数据管理不同,数据治理更侧重于制定行业级制度规范,通过建立数…...

常见的几种设计模式(详细)——应用场景和实现方式

文章目录 🎯单例模式应用实现 🏭工厂模式应用实现 ❓策略模式应用实现 🧑‍⚖️代理模式应用实现 🔍观察者模式(发布订阅模式)应用实现 🧰装饰器模式应用实现 📰模版方法模式应用实现…...

SonarQube

不同版本的sonarqube需要不同版本的数据库、jdk环境。这个看文档然后确定要求 (有时候文档里标注的系统要求是不行的。比如要求内存2G,但是实际上是不够的,要注意) 我安装的: 官方文档 Prerequisites and overview…...

Nginx 之Rewrite 使用详解

文章目录 1. 概述2. Rewrite 指令 2.1 指令语法2.2 Flag 标记说明 3. Rewrite 与 Location 3.1 Location 分类3.2 Rewrite 和 Location 比较 4. Rewrite 实际场景 4.1 基于域名的跳转4.2 基于客户端 IP 访问跳转4.3 基于参数匹配的跳转4.4 基于目录下所有 PHP 文件跳转4.5 基于…...

注册Gmail如何跳过手机验证环节?

很多小伙伴在注册Gmail的时候都会遇到一个难题:手机号码验证,有可能包括了“手机号无法验证” “国内手机号验证失败” “收不到验证码”等等问题,但 根据真实案例,还有部分人则是“幸运地”没有手机号验证环节,那么今…...

WordPress自助建站全攻略

一、基础概念与核心优势 WordPress自助建站是一种无需编程即可搭建网站的平台,基于开源CMS系统,支持高度定制化。其核心优势主要体现在: 易用性:拖拽式编辑器和直观的后台操作,适合零基础用户快速上手。低成本&#x…...

TreeSet(单列集合)

TreeSet 是 Java 集合框架中的一种实现了 Set 接口的类,它通过一个红黑树(Red-Black Tree)来存储元素。由于使用了树结构,TreeSet 保证了元素的有序性,并且不允许重复元素。 1. TreeSet 的基本特性 有序性&#xff1…...

Elasticsearch:同义词在 RAG 中重要吗?

作者:来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索,以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为,由于…...

Docker安装分布式vLLM

Docker安装分布式vLLM 1 介绍 vLLM是一个快速且易于使用的LLM推理和服务库,适合用于生产环境。单主机部署会遇到显存不足的问题,因此需要分布式部署。 分布式安装方法 https://docs.vllm.ai/en/latest/serving/distributed_serving.html2 安装方法 …...

可视化实操记录(自用)

流程 读取数据 original_data pd.read_csv(“Penguins.csv”) original_data.head() 评估和清理数据 cleaned_data original_data.copy() #备份 结构 original_data.sample(5) 数据符合“每个变量为一列,每个观察值为一行,每种类型的观察单位为一…...

二叉树的遍历方式和子问题思路

目录 二叉树的遍历: 前序遍历: 中序遍历: 后序遍历: 二叉树的基本操作: 求树的结点个数(递归遍历思路): 求树的结点个数(子问题思路): 求树的…...

运用Deek Seeker协助数据分析

我的数据源有两张表,一个是每日销售表(字段有日期、产品名称、实际销量),一个是每月目标表(字段有年度月份、产品名称、目标销量);我的需求是,按月、按年来统计每个产品的目标完成情况请问用PowerBl进行分析,应该如何建立数据模型…...

服务器之连接简介(Detailed Explanation of Server Connection)

一台服务器最大能支持多少连接?一台客户端机器最多能发起多少条连接?? 我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、…...

低空经济:开启未来空中生活的全新蓝海

引言 随着科技的进步,我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过,未来的某一天,快递、外卖可以像魔法一样直接从空中送到你手中?或者,你能乘坐小型飞行器,快速穿梭于城市之间,告别拥堵…...

主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉

AV-ALOHA 系统使用用于 AV 的 VR 耳机实现直观的数据收集,并且 用于作的 VR 控制器或引线臂。这有助于捕捉全身和头部 远程作我们的真实和模拟系统的运动,记录来自 6 个的视频 不同的摄像头,并为我们的 AV 仿制学习策略提供训练数据。 加州大…...

洛谷 P6419 COCI2014/2015 #1 Kamp 题解

题意 一颗树 n n n 个点, n − 1 n-1 n−1 条边,经过每条边都要花费一定的时间,任意两个点都是联通的。 有 k k k 个人(分布在 k k k 个不同的点)要集中到一个点举行聚会。 聚会结束后需要一辆车从举行聚会的这点…...

在 Vue 项目中使用 SQLite 数据库的基础应用

目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm:确保已安装 Node.js 和 npm。 创建 Vue 项目:使用 Vue CLI 创建一个…...

AI会话问答的页面滚动处理(参考deepseek页面效果)

近期在接入deepseekR1的深度思考,研究了下deepseek官网的滚动效果,大概如下:用户发出消息后,自动滚动到页面最底部,让最新消息展示在视野中,这时候,我们先处理一次滚动: const scrol…...

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名:Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期:2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中,许多节点的连接度较低(即…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...