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

news2025/5/13 6:24:25

文章目录

  • 前言
  • 一、引入依赖
  • 二、创建一个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.yml
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    druid:
      initial-size: 5
      min-idle: 10
      max-active: 20
      validation-query: SELECT 1
      filters: stat,slf4j
      # 统计 SQL 执行情况
      stat:
        merge-sql: true
        log-slow-sql: true
        slow-sql-millis: 5000
      web-stat-filter:
        #不统计这些请求数据
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      #访问监控网页的登录用户名和密码
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: light-druid
        login-password: light-druid

# MyBatis
mybatis:
  # 搜索指定包别名
  type-aliases-package: com.light.**.entity
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis-config.xml

logging:
  level:
    org.mybatis: debug
    com.light.generator.mapper: debug

四、创建shardingsphere-config.yml

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

# ShardingSphere 配置模式,配置为 Standalone(独立模式)
mode:
  type: Standalone
  repository:
    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,配置了字符编码、时区、是否使用 SSL
    username: 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,配置了字符编码、时区、是否使用 SSL
    username: 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  # 主键列为 id
          keyGeneratorName: snowflake  # 使用 Snowflake 算法生成主键

    # 配置分库算法
    shardingAlgorithms:
      database_inline:
        type: INLINE  # 使用 INLINE 算法
        props:
          algorithm-expression: ds_${id % 2}  # 分库算法,根据 id 字段的值做取余运算,分配到 ds_0 或 ds_1 数据源

    # 配置主键生成算法
    keyGenerators:
      snowflake:
        type: SNOWFLAKE  # 使用 Snowflake 算法生成全局唯一的 ID
        props:
          worker-id: 123  # 配置 Snowflake 算法的工作机器 ID,用于生成唯一的 ID

# 配置一些全局属性
props:
  sql-show: true  # 是否显示 SQL 执行日志,设置为 true 时会在日志中输出 SQL

完整项目结构

在这里插入图片描述

五、测试

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

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

总结

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

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

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

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

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

相关文章

【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】

在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…

宠物企业宣传网站静态模板 – 前端静态页面开发实例

该宠物宣传企业站是一个基于前端技术构建的静态网站,旨在为宠物行业的企业提供一个简洁、现代的在线展示平台。整个网站采用HTML、CSS和JavaScript三种技术,确保了良好的用户体验和页面表现。 前端技术: HTML:HTML负责构建网站的…

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)——4.2 LSTM的引入与解决长期依赖问题的方法】

在人工智能的璀璨星空中,深度学习模型犹如一颗颗耀眼的星辰,引领着技术的革新。而在处理序列数据的领域中,循环神经网络(RNN)无疑是那颗最为亮眼的星星。然而,即便是这样强大的模型,也面临着一些棘手的问题,其中最突出的便是长期依赖问题。今天,我们就来深入探讨一下长…

el-input输入框样式修改

el-input输入框样式修改 目的:蓝色边框去掉、右下角黑色去掉(可能看不清楚) 之前我试过deep不行 最有效的办法就是就是在底部添加一下css文件 代码中针对input的type为textarea,对于非textarea,只需将下面的css样式中的textarea替换成input…

日常问题-pnpm install执行没有node_modules生成

日常问题-pnpm install执行没有node_modules生成 1.问题2.解决方法 1.问题 执行pnpm i后,提示Scope: all 3 workspace projects Done in 503ms,而且没有node_modules生成。很奇怪 2.解决方法 确保根目录有 pnpm-workspace.yaml 文件: 把这…

C++-----------酒店客房管理系统

酒店客房管理系统 要求: 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订,系统会自动判断客房的可用情况; 4.入住管理:客户入住…

ORDER BY盲注攻击:原理、实现与防御(附Python多线程爆破脚本)

引言 在SQL注入攻击中,ORDER BY注入是一种容易被忽视但危害极大的漏洞类型。与传统的UNION或WHERE注入不同,ORDER BY参数通常无法直接返回查询结果,攻击者需要依赖**盲注(Blind SQLi)**技术逐字符提取数据。本文将结合…

人工智能在临床应用、药物研发以及患者护理等方面的最新研究进展|顶刊速递·25-02-12

小罗碎碎念 推文速览 第一篇文章提出 CRAFT-MD 框架评估临床大语言模型(LLMs)在医患互动任务中的表现,发现其存在局限性,并基于结果给出改进评估的建议。 第二篇文章全面阐述了 2019 年以来人工智能在小分子药物研发全流程&#…

【物联网】电子电路基础知识

文章目录 一、基本元器件1. 电阻2. 电容3. 电感4. 二极管(1)符号(2)特性(3)实例分析5. 三极管(1)符号(2)开关特性(3)实例6. MOS管(产效应管)(1)符号(2)MOS管极性判定(3)MOS管作为开关(4)MOS管vs三极管7. 门电路(1)与门(2)或门(3)非门二、常用元器件…

辛格迪客户案例 | 钥准医药科技GMP文件管理(DMS)项目

01 创新药企,崛起于启东 在我国医药行业蓬勃发展的浪潮中,钥准医药科技(启东)有限公司(以下简称“钥准医药”)犹如一颗冉冉升起的新星,闪耀着创新与活力的光芒。成立于2015年,钥准医…

Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲

Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲 dijkstra(堆优化版) 题目 https://www.programmercarl.com/kamacoder/0047.%E5%8F%82%E4%BC%9Adijkstra%E5%A0%86.html 小明参加科学大会 思路 思路 朴素版的dijkstra,时间复杂度为O(n^2)&am…

w208基于spring boot物流管理系统设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

望远镜成像系统--科学评价光学镜头

望远镜是一种利用透镜或反射镜以及其他光学器件观测遥远物体的光学仪器。其原理是通过透镜的折射或反射镜的反射,将光线聚焦成像,再经过一个放大目镜进行观察。日常生活中的光学望远镜又称“天文望远镜”。1608年,荷兰的一位眼镜商汉斯利伯希…

产品更新 | 华望M-Design 平台的AI 建模功能即将上线

前言 在 AI 技术加速发展的背景下,杭州华望系统科技有限公司在⼤语⾔模型与 SysML 标准进行深度结合的基础上,强力推出AI建模功能。该功能⽀持⽤户通过上传⽂档或对话交互等⽅式完成需求智能增强、模型动态构建与细节补充、实时获取结构化反馈等业务。⽬…

RabbitMQ 在 Spring Boot中使用方式

文章目录 作用MQ docker 安装MQ使用RabbitMQ的整体架构及核心概念:RabbitMQ的整体架构及核心概念:消费者消息推送限制交换机与队列## 项目使用MQDirect: 直连模式Fanout: 广播模式Topic: 主题模式Headers: 头信息模式 使用DEMO地址异常问题记录 作用 Ra…

HAL库框架学习总结

概述:HAL库为各种外设基本都配了三套 API,查询,中断和 DMA。 一、HAL库为外设初始化提供了一套框架,这里以串口为例进行说明,调用函数 HAL_UART_Init初始化串口,此函数就会调用 HAL_UART_MspInit&#xff0…

深入解析系统调用接口(System Call Interface, SCI)

在操作系统的世界中,用户态应用程序无法直接访问内核态资源,而必须通过一种受控的方式进行交互。这种方式就是系统调用(System Call)。系统调用接口(System Call Interface, SCI)是用户程序与操作系统内核之…

深入理解Linux网络随笔(一):内核是如何接收网络包的(下篇)

3、接收网络数据 3.1.1硬中断处理 数据帧从网线到达网卡时候,首先到达网卡的接收队列,网卡会在初始化时分配给自己的RingBuffer中寻找可用内存位置,寻找成功后将数据帧DMA到网卡关联的内存里,DMA操作完成后,网卡会向…

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决?

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决? 宝子们,是不是在玩《只狼》的时候,突然弹出一个提示:“找不到mfc140u.dll文件”?这可真是让人着急上火!别慌,今…

SSM开发(十二) mybatis的动态SQL

目录 一、为什么需要动态SQL? Mybatis 动态 sql 是做什么的? 二、多种动态 SQL 元素 三、示例 1、model定义 2、数据库定义 3、UserMapper接口及UserMapper.xml内容定义 if标签 choose/when/otherwise 标签 foreach标签 trim 标签 四、动态SQL注意 一、为什么需…