sharding-jdbc 分库分表_帅宇Yeah~的博客-程序员宅基地

技术标签: sharding-jdbc  java  数据库  

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>sharding_test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sharding_test</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <mybatis-plus.version>3.5.2</mybatis-plus.version>
        <druid.version>1.2.6</druid.version>
        <mysql.version>8.0.25</mysql.version>
        <lombok.version>1.18.20</lombok.version>
        <sharding.version>4.1.1</sharding.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

        <!--数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <!-- sharding-jdbc -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>${sharding.version}</version>
        </dependency>

    </dependencies>

</project>

单库分表

数据库信息

在这里插入图片描述

配置信息

spring:
  shardingsphere:
    #开启sql显示
    props:
      sql:
        show: true
    datasource:
      # 配置数据源
      names: db
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/sharding_test?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
    sharding:
      #未配置分片规则的表将通过默认数据源定位-适用于单库单表,该表无需配置分片规则
      default-data-source-name: db
      # 分表策略 groovy脚本
      tables:
        db_user:
          actual-data-nodes: db.db_user_$->{
    0..2}
          key-generator:
            column: id  # 主键ID
            type: SNOWFLAKE  # 生成策略雪花id
          # 添加数据分表策略
          table-strategy:
            inline:
              # 添加数据分表字段(根据字段插入数据到那个表)
              sharding-column: id
              # 分片算法表达式 => 通过id取余
              algorithm-expression: db_user_$->{
    id % 3}

多库分表

数据库信息

广播表:db_class;
单一表:db_teacher ;
分表:db_user;

在这里插入图片描述

配置信息

spring:
  shardingsphere:
    #开启sql显示
    props:
      sql:
        show: true
    datasource:
      # 配置数据源,
      names: db0,db1
      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/sharding_test_0?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/sharding_test_1?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
    sharding:
      #设置唯一库数据
      default-data-source-name: db0
      #分库分表
      default-database-strategy:
        inline:
          # 添加数据分表字段(根据字段插入数据到那个表)
          sharding-column: id
          # 分片算法表达式 => 通过id取余
          algorithm-expression: db$->{
    id % 2}
      # 分表策略 groovy脚本
      tables:
        db_user:
          actual-data-nodes: db$->{
    0..1}.db_user_$->{
    0..2}
          key-generator:
            column: id  # 主键ID
            type: SNOWFLAKE  # 生成策略雪花id
          # 添加数据分表策略
          table-strategy:
            inline:
              # 添加数据分表字段(根据字段插入数据到那个表)
              sharding-column: id
              # 分片算法表达式 => 通过id取余
              algorithm-expression: db_user_$->{
    id % 3}
        #广播表
        db_class:
          actual-data-nodes: db$->{
    0..1}.db_class
          key-generator:
            column: id  # 主键ID
            type: SNOWFLAKE  # 生成策略雪花id
      #广播表
      broadcast-tables: db_class
      #绑定表避免JOIN 笛卡尔积
      binding-tables: db_user,db_class

存在多个广播表:

        #广播表
        db_class:
          actual-data-nodes: db$->{
    0..1}.db_class
          key-generator:
            column: id  # 主键ID
            type: SNOWFLAKE  # 生成策略雪花id
        #广播表
        db_teacher:
          actual-data-nodes: db$->{
    0..1}.db_teacher
          key-generator:
            column: id  # 主键ID
            type: SNOWFLAKE  # 生成策略雪花id
      #广播表
      broadcast-tables: db_class,db_teacher

读写分离前提:mysql 主从复制

数据库信息

在这里插入图片描述

配置信息

# 双主双重
spring:
  shardingsphere:
    #开启sql显示
    props:
      sql:
        show: true
    datasource:
      # 配置数据源
      names: master0,slave0,master1,slave1
      master0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.0.224:3306/sharding_test?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
      slave0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.0.222:3306/sharding_test?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
      master1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.0.223:3306/sharding_test?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
      slave1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.0.221:3306/sharding_test?useUnicode=true&character_set_server=utf8mb4&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
    sharding:
      #唯一库数据
      default-data-source-name: master0
      master-slave-rules:
        #读写分离
        db0:
          master-data-source-name: master0
          slave-data-source-names: slave0
          # 如果一主多从的配置需要设置查询算法  从库查询数据的负载均衡算法 目前有2种算法 round_robin(轮询)和 random(随机)
#          load-balance-algorithm-type: ROUND_ROBIN
        db1:
          master-data-source-name: master1
          slave-data-source-names: slave1
#          load-balance-algorithm-type: ROUND_ROBIN
      # 分库分表
      default-database-strategy:
        inline:
          # 添加数据分表字段(根据字段插入数据到那个表)
          sharding-column: id
          # 分片算法表达式 => 通过id取余
          algorithm-expression: db$->{
    id % 2}
      # 分表策略 groovy脚本
      tables:
        db_user:
          actual-data-nodes: db$->{
    0..1}.db_user
          key-generator:
            column: id  # 主键ID
            type: SNOWFLAKE  # 生成策略雪花id

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43383907/article/details/129482374

智能推荐

深入理解分布式技术 - 分布式锁的应用场景和主流方案_分布式 应用场景_小小工匠的博客-程序员宅基地

文章目录案例案例秒杀、大促之类的活动,一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?下面提供一个解决方案: 分布式锁我们都知道,在业务开发中,为了保证在多线程下处理共享数据的安全性,需要保证同一时刻只有一个线程能处理共享数据。Java 语言给我们提供了线程锁,开放了处理锁机制的 API,比如 Synchronized、_分布式 应用场景

SQLServer无法远程连接的原因及解决方式-程序员宅基地

如网上很多朋友遇到的情况一样,因为许久不用SQLServer了,最近下载安装了一个2014版本的,启动服务后,发现使用Aqua Data Studio根本连不上,一看1433端口没有监听;于是网上搜索解决方案,基本上都是说在 SQLServer的管理配置界面设置一下,tcp/ip的端口即可。也的确如此;但我遇到的情况相对特殊一些,因为本机安装了虚拟机,虚拟了很多的网卡以及IP,所以

【Web漏洞】CORS跨域资源共享漏洞_cors(跨域资源共享)定义了一种允许客户端跨域请求的机制。此应用程序正以不安全的-程序员宅基地

文章目录CORS跨域资源共享简单跨域请求非简单请求CORS的安全问题CORS漏洞的利用有关于浏览器的同源策略和如何跨域获取资源,传送门 -->浏览器同源策略和跨域的实现方法同源策略(SOP)限制了应用程序之间的信息共享,并且仅允许在托管应用程序的域内共享。这有效防止了系统机密信息的泄露。但与此同时,也带来了另外的问题。随着Web应用程序和微服务使用的日益增长,出于实用目的往往需要将信息从..._cors(跨域资源共享)定义了一种允许客户端跨域请求的机制。此应用程序正以不安全的

Convolutional Neural Network Based Fault Detection for Rotating Machinery(翻译)-程序员宅基地

基于卷积神经网络的旋转机械故障检测原文:https://doi.org/10.1016/j.jsv.2016.05.027摘要振动分析是一项成熟的技术,用于监测旋转机械的状态,因为振动模式因故障或机器状况而异。目前,主要采用人工设计的特征,如滚道的传球频率、RMS、峰度和波峰,用于自动故障检测。不幸的是,设计和解释这些特征需要相当程度的人类专业知识。为了使非振动分析专家能够进行状态监测,需要尽可能减少针对特定故障的特征工程的开销。因此,本文提出了一种基于卷积神经网络的状态监测特征学习模型。该方法的目的_convolutional neural network based fault detection for rotating machinery

google-breakpad在 C++11下编译错误 ISO C++ forbids declaration of ‘typeof’ with no type_typedef ‘’ is initialized (use decltype instead)-程序员宅基地

ISO C++ forbids declaration of ‘typeof’ with no typetypedef ‘google_breakpad::typeof’ is initialized (use decltype instead)因为 C++11 把关键字_typedef ‘’ is initialized (use decltype instead)

java程序员你该知道风光背后的危机-程序员宅基地

Java行业在当下人才是供不应求,但是作为Java程序员的你也得居安思危,你要知道你身处的是一个高速变化的行业,稍不留意你的位置还是存在被取代的风险。这些承担着技术招聘市场中高供给高需求的 Java 程序员在 17 年的招聘市场上,真的还能如此风光吗?还是埋下了一些「危机」的伏笔呢?(看到文末有...

随便推点

winform panel显示滚动条属性设置-程序员宅基地

1.autoscoll 设为true2.autoscrollMinSize,设置panel出现滚动条时的最小宽度和高度。_winform 滚动条宽度

golang 上传,下载图片_go 下载图片-程序员宅基地

package main;import ( "fmt" "io" "io/ioutil" "os" "path" "net/http" "errors" "strings") func main() { http.HandleFunc("/upload/&quo_go 下载图片

基于HTML5的移动Web应用——Geolocation地理定位_web geolocation-程序员宅基地

地理位置一般是用来描述地理事物的空间关系。通常情况下,用经纬度可以准确地描述地理位置。而通常所说的地理定位也是找到该地理位置的经纬度作为坐标来进行定位的。在PC端,通常使用IP来定位该IP用户的位置,移动端定位有多种方式,最准确的是GPS。在Web开发中,Geolocation API (地理位置应用程序接口)提供了准确知道浏览器用户当前位置的功能。本节将对Geolocation地理定位进行详细讲..._web geolocation

Linux常用命令学习(更新中)-程序员宅基地

[b]1.man[/b] 说明 :查阅命令帮助 格式:man 命令 eg. man cat[b]2.cat[/b] 说明:把档案串连接后传到基本输出(屏幕或加 > fileName 到另一个档案) 格式:$ cat filename 一次显示整个文件 $ cat > filename 从键盘创建一个文件 ..._^_^deb'^_^b

开发BHO插件4-程序员宅基地

前言: 本文档是为了演示如何使用V2005开发一个简单的BHO组件,BHO组件是实现了IObjectWithSite接口的 COM对象,该COM对象与IE进行绑定。 本文档将逐步演示如何建立BHO组件的过程,该组件实现的功能:首先当装载WEB页的时候 打印出"Hello world"信息,然后把该WEB页的所有图片资源删除。

Unity之UGUI的学习(六):Toggle(开关)_unity toggle-程序员宅基地

什么是Toggle?Toggle(开关)是用来让用户打开或关闭某个选项的复选框。通过在Hierarchy视图下右键 ->UI -> Toggle可以创建Toggle。属性和功能属性功能Interactable控制该组件是否接受输入。如果该选项没有被选中时,表示Toggle不能接受输入且动画过渡不可用。Transition用于控制Toggle响应用户操作方式。Navigation用来控制UI控件的键盘导航如何实现Is On默认是否勾选T_unity toggle