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

九.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.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.kler.cn/a/545860.html

相关文章:

  • TikTok成功打破传统媒体壁垒,用户涌入平台创作
  • 3D数字化技术:重塑“人货场”,开启营销新纪元
  • 华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B
  • Docker 镜像的构建与管理(二)
  • VM ubuntu20.04虚拟机找不到可移动设备怎么解决
  • 智能手表表带圆孔同心度检测
  • 【Qt】:概述(下载安装、认识 QT Creator)
  • 第1章 信息化发展(一)
  • 达梦分布式集群DPC_架构详解_yxy
  • 朝天椒USB服务器解决前置机U盾虚拟机远程连接
  • web自动化笔记(二)
  • MySQL 定时备份与恢复
  • snort3.0 获取注册规则(19000多条)
  • DeepSeek 开放平台无法充值使用 改用其他中转平台API调用DeepSeek-chat模型方法
  • iThenticate有中文版官网吗,是否可信
  • 【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导
  • Halcon和VisionMaster还有Opencv中旋转矩形的处理
  • 深入了解常见MCU架构:ARM、AVR与其他嵌入式系统
  • DeepseeK自动写作,自动将回答导出文档
  • C++之线程