SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置

2023-11-03


文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!!
文章内容将分开发布,便于平时查阅。


基于yaml基本配置

  1. 在application.yml配置文件中对mybatis-plus做简单的配置,这里不对Mybatis-Plus做主要配置讲解,像@MapperScan其他配置先自行了解。
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql,后续可以与sharding打印的sql做对比,更加直观发现区别
  mapper-locations: classpath*:mybatis/*.xml # mapper.xml的路径

  1. 新建一个application-sharding.yml文件,对sharding-jdbc进行配置,然后在application.yml中的active添加进去即可。

Sharding-JDBC简单介绍:定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。更详细的介绍可前往 ShardingSphere官网
分库分表包含:(垂直分库|垂直分表|水平分库|水平分表)四种类型。需要详细了解可参考其他博主的博客:彻底搞清分库分表

接下来,将根据不同需求的对sharding进行两种配置方式。

(1) 单库分表
# 单库分表
spring:
  shardingsphere:
    datasource:
      names: db0 # 指定数据源名字,多数据源以逗号分隔

      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/sharding_test1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
        username: root
        password: 123456

    sharding:
      # default-data-source-name: db0 # 默认数据源
      tables: # 具体分片规则配置
        t_user: # 逻辑表名
          key-generator-column-name: id # 主键
#         key-generator: # 使用雪花算法id
#           column: id
#           type: SNOWFLAKE
          actual-data-nodes: db0.t_user_$->{0..1} # 实际的数据节点(数据源名.逻辑表名)
          # 分表规则
          table-strategy:
            inline: # 行表达式
              sharding-column: uid
              algorithm-expression: t_user_$->{uid%2} # 按模运算分配	
	
    # 绑定表规则,即逻辑表名。(例如t_user代表了t_user_0, t_user_1, t_user_2 ...)
    binding-tables: t_user
    props:
      sql.show: true # 是否开启SQL显示

  ###  actual-data-nodes                           读取数据分表策略
  ###  table-strategy.inline                       添加数据分表策略
  ###  table-strategy.inline.sharding-column       添加数据分表字段(根据哪个字段插入数据到那个表,如:uid)
(2) 分库分表。可先熟悉使用,后续会出集成到多数据源来更好的使用
spring:
  shardingsphere:
    datasource:
      names: db0,db1 # 指定数据源名字,多数据源以逗号分隔

      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/sharding_test_1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
        username: root
        password: 123456

      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/sharding_test_2?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
        username: root
        password: 123456

    sharding:
      default-data-source-name: db0 # 默认数据源
      
      tables: # 具体分片规则配置
        t_user: #逻辑表名
          key-generator-column-name: id # 主键
#         key-generator: # 使用雪花算法id
#           column: id
#           type: SNOWFLAKE
          actual-data-nodes: db$->{0..1}.t_user_$->{0..1} # 实际的数据节点(数据源名.逻辑表名) 
          # 分库规则
          database-strategy: 
            inline: # 行表达式
              sharding-column: id
              algorithm-expression: db$->{id % 2}
          # 分表规则
          table-strategy: 
            inline: # 行表达式
              sharding-column: uid
              algorithm-expression: t_user_$->{uid % 2} # 按模运算分配
#        sys_user: # 非设置为默认数据库的,数据库中不需要分表的可以这么配,表多时候会很麻烦,后面会讲一个配置多数据源的方法,更为简便
#          actual-data-nodes: db1.sys_user
#          table-strategy:
#            none:
#              any: none
    # 绑定表规则,即逻辑表名。(例如t_user代表了t_user_0, t_user_1, t_user_2 ...)
    binding-tables: t_user
    props:
      sql.show: true # 是否开启SQL显示

遇过的坑(注意):
  • 原生自增主键有使用限制,不能将原生自增主键同时作为分片键使用。
    由于ShardingSphere并不知晓数据库的表结构,而原生自增主键是不包含在原始SQL中内的,因此ShardingSphere无法将该字段解析为分片字段。如自增主键非分片键,则无需关注,可正常返回;若自增主键同时作为分片键使用,ShardingSphere无法解析其分片值,导致SQL路由至多张表,从而影响应用的正确性。
    而原生自增主键返回的前提条件是INSERT SQL必须最终路由至一张表,因此,面对返回多表的INSERT SQL,自增主键则会返回零。

  • 如果表中没有可以作为分片键的字段,我个人认为可以将表的主键改为成雪花算法id。对于分布式x项目或者分库的情况,则需要自定义分布式主键配置。后续也会出一篇文章专门写道。

  • 如果只有部分数据库分库分表,我们是需要将不分库分表的表也配置在分片规则中,就像上面(2)中 被注释掉的sys_user所示那样。对于这部分具体配置说明以及我个人认为更好的配置,将在后续文章中写道。

  • 默认的分库分表作者没有调试过,因为感觉自己项目只需要部分表的分库分表,除非你是所有表都都需要分库分表,你可以自己看文档试试。

  • 由于MyBatis-Plus和Sharding-JDBC各自都有一套雪花算法来生成ID,下一篇文章将单独说明一下两者之间,作者在配置过程中所遇到的问题,以及解决方案。

  • 分片的算法规则,不单只有inline表达式算法,还有像hint算法等等其他,后续会再出一篇文章讲解。


事先说明,该系列下的所有文章均为作者查阅很多配置资料后整理得出,主要用于个人记录学习的配置资料不涉及原理,仅作参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置 的相关文章

随机推荐

  • warning: ignoring unsupported character ‘问题修复

    rivers net wireless aic8800 Kconfig 1 ignoring unsupported character 问题修复 有一次编译内核 看到有下面的warning jian jian share kylin rk
  • windows live writer 离线写blog

    微软发布的软件windows live writer 可以离线写blog 也就是说 你可以在windows live writer这个软件编辑blog 然后点击 发布 见blog发送到指定网页上 前提是需要在windows live wri
  • 关于ios手机嵌套h5页面滚动兼容问题解决

    1 使用绝对定位 滚动元素使用绝对定位 position absolute top 0 left 0 bottom 0 height 100vh overflow y srcoll 2 添加兼容样式 webkit overflow scro
  • 华为OD机试 - 最大括号深度(Java)

    题目描述 现有一字符串仅由 六种括号组成 若字符串满足以下条件之一 则为无效字符串 任一类型的左右括号数量不相等 存在未按正确顺序 先左后右 闭合的括号 输出括号的最大嵌套深度 若字符串无效则输出0 0 字符串长度 100000 输入描述
  • stats

    本篇介绍基础包stats中的一个函数nls 它的作用是求解非线性回归的待定参数 nls formula data start control algorithm trace subset weights na action model lo
  • 标准库类型sring

    1 string 类型表示可变长的字符序列 需要包含头文件 include 2 定义和初始化 string 对象 拷贝初始化 使用了 号 直接初始化 用 3 string 对象的操作 cin lt lt string 会忽略前面的空白的无效
  • Java访问数据库的速度瓶颈问题的分析及解决

    内容 速度瓶颈问题的提出 JDBC访问数据库的机制 不同模式的 JDBC接口的选择 Java程序中SQL语句格式的优化 软件模型中对数据库访问的设计模式的优化 将深入研究的问题 参考资料 关于作者 FoolsGarden SMTH 自由Ja
  • 解决VS Code连接远程服务器使用Python中的matplotiib包画图无法显示的问题

    项目场景 在使用VS Code连接远程服务器使用Python中的matplotiib包画图时 会出现无法显示的问题 问题描述 在直接执行画图程序时 会报错 RuntimeError Invalid DISPLAY variable 原因分析
  • [Java学习]报错:类 OperatorDemo01 是公共的, 应在名为 OperatorDemo01.java 的文件中声明

    搭建好环境 用notepad 编写完程序 打开cmd编译文件 算数运算符 public class OperatorDemo01 public static void mian String args int a 6 int b 4 Sys
  • 编译原理(第四版)复习 (一)

    第一章 编译概述 编译程序 将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序 解释程序 也是一种翻译程序 将源程序翻译并执行 边解释边执行 两者的区别 解释程序的执行过程不会生成目标程序 编译过程的5个阶段 词法分析 语法分析
  • 用Python实现进制转换,这一篇教程就够了

    Python 实现进制转换 一 导言 导语 在计算机进行数据交换时 常常会有一个进制转换的过程 我们知道计算机只认0 和 1 在内存系统中 基本基于二进制进行运算的 但是有时候数据过于庞大 为了方便存储管理 计算机会使用十六进制存储数据 但
  • GNU-ld链接脚本浅析

    0 Contents 1 概论 2 基本概念 3 脚本格式 4 简单例子 5 简单脚本命令 6 对符号的赋值 7 SECTIONS命令 8 MEMORY命令 9 PHDRS命令 10 VERSION命令 11 脚本内的表达式 12 暗含的连
  • web前后端分离

    1 介绍 参考链接 https www cnblogs com leotsai p vuejs front backend architecture html 前后端分离的话 则可以很好的解决前后端分工不均的问题 将更多的交互逻辑分配给前端
  • JDBC学习(四)时间类型

    在Java代码中 java sql包原则上不能出现在DAO以外的地方 数据库和java中的时间类型的对应关系 DATE gt java sql Date TIME gt java sql Time TIMESTAMP gt java sql
  • 概念基础:恶意软件混淆的方法

    2020 05 20 看了一些网站的内容 发现主要存在四种方式 xor 加壳 base64编码 rot13 arm的一个指令 1 2 分别是简答介绍了这集中方式 3 是一个实验室的工具 可以取出一些混淆的字符串 但是只支持pe格式 在原理方
  • Android和iOS 测试五个最好的开源自动化工具

    本文主要介绍Android和iOS 五个最好的开源自动化工具 这里整理了相关资料 希望能帮助测试软件的朋友 有需要的看下 自动化测试在产品测试上有着非常重要的作用 实现测试自动化有多种积极的方式 包括最大限度地减少测试执行时间 在关键的发布
  • 相约久久网 -- 有很多东西值得学习

    http www meet99 com 转载于 https www cnblogs com yqskj archive 2012 10 07 2714622 html
  • flutter 怎么实现app整体灰度

    今天举国哀悼 进入各种大厂的app也可以看到主色都变成灰色的了 作为程序员我们肯定会想怎么可以实现的 我简单研究了10分钟 flutter中只要在整体外面套一个ShaderMask 然后修改blendMode即可 核心代码 class My
  • CentOS7目录结构详细版

    原文地址 http www cnblogs com ellisonDon archive 2012 10 03 2710730 html 原文地址 https www cnblogs com ellisonDon archive 2012
  • SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置

    文章只负责讲解sharding的相关配置 springboot其他的配置自己解决 文章内容将分开发布 便于平时查阅 基于yaml基本配置 在application yml配置文件中对mybatis plus做简单的配置 这里不对Mybati