Sharding-JDBC分库分表

参考:

https://mp.weixin.qq.com/s/A6WS1CSjF7wvBE_gKLyp8w
https://shardingsphere.apache.org/document/legacy/4.x/document/cn/quick-start/sharding-jdbc-quick-start/

注意:

支持的sql项:

全面支持DML、DDL、DCL、TCL和部分DAL。支持分页、去重、排序、分组、聚合、关联查询(不支持跨库关联)

不支持sql项:

不支持CASE WHEN、HAVING、UNION (ALL),有限支持子查询

提示:

对于使用 jion on语法时,建议采用绑定表(指分片规则一致的主表和子表)
比如 user表(user_1, user_2)
和user_detail表(user_detail_1, user_detail_2),
两个的分片键都是 user_id,
那么查询的时候sql就会是
user_1 left jion user_detail_1 on u.id = d.id
user_2 left jion user_detail_2 on u.id = d.id
如果不是绑定表,那就是两个表的笛卡尔积(浪费查询,且参数需要两表都设置,不然会冗余,具体可查看下面的测试部分——表关联测试示例)
user_1 *  user_detail_1,
user_1 *  user_detail_2,
user_2 *  user_detail_1,
user_2 *  user_detail_2

常用功能:

(1)数据分片

(2)读写分离(主库仅仅支持单主库,从库支持多个)

是属于代理层框架,我们跟之前mybatis一样写代码即可,框架会根据设置的分库分表配置进行改造我们的sql,对于开发来说,其实是类似无感知的。
eg:
配置好shardingJdbc配置类后,正常写sql: select * from user whre id = 1111;
假设,用户表在数据库中是 user_1, user_2, user_3(水平分表)不需要有名字为user的表,分片方式是 (id % 3);
那么真正执行的sql流程是
1111 % 3 = 1
所以执行的sql会被改造成 select * from user_1 whre id = 1111;
那么执行 写入表是会作用于 user_1, 读的时候也会作用于 user_1, 如果扩表了,分片方式改成了 id % 4, 那么之前的数据就需要迁移处理,不然会找不到的。所以分片方式很重要!!!

关键点:分片方式

分片方式,分为两种常用场景

(1)数据量是可预知,比如未来十年肯定不会数量肯定不会超过5000W,那么直接分10张表,用id % 10 或者 Hash值 % 10, 每张表大约500W(会有数量量偏移,只要看id的生成策略)

(2)数据量无法或者不好预支,且是个不断增量的过程,那么可以采用数量的方式,但是id需要定制处理,考虑用redis, 比如id 从200000000000+ 递增,那么{id.mod(10000000000).intdiv(5000000) + 1}那么就能控制每张表固定数量,除非id挑号了,有序的id在电商等信息中不适合使用,容易别竞争对手根据id估算数据,但是大部分情况下还是适用的,且有序的id在处理数据上会很有用,比如某一段数据出问题,可以利用有序的范围阶段处

步骤概述

(1)引入shardingsphere依赖
(2)配置文件配置主从数据库
(3)注册数据源DataSource,配置读写分离和各个表的分表策略
(4)启动类移除默认数据库配置@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

步骤详细

1、引入依赖:

<?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.7.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>sharding-jdbc</artifactId><version>0.0.1-SNAPSHOT</version><name>sharding-jdbc</name><description>Demo project for Spring Boot</description><properties><java.version>11</java.version><hutool.version>5.8.15</hutool.version><pagehelper.version>1.4.2</pagehelper.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>4.1.1</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.yml</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

2、配置:

# mysql
spring.datasource.druid:ds-master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=trueusername: rootpassword: 123456initial-size: 1 #初始化时建立物理连接的个数max-active: 16 #最大连接池数量min-idle: 1 #最小连接池数量max-wait: 6000 #获取连接时最大等待时间,单位毫秒filters: stat,wall #开启监控统计,防御sql注入过滤器ds-slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=trueusername: rootpassword: 123456initial-size: 1 #初始化时建立物理连接的个数max-active: 16 #最大连接池数量min-idle: 1 #最小连接池数量max-wait: 6000 #获取连接时最大等待时间,单位毫秒filters: stat,wall #开启监控统计,防御sql注入过滤器

3、注册DataSource,配置读写和分表

如果喜欢采用yml方式:参考https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/configuration/config-yaml/
支持Apollo,建议Apollo Client 1.5.0及其以上版本

@Configuration
public class ShardingDataSourceConfigurer {@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.ds-master")
public DataSource masterDataSource() {return DruidDataSourceBuilder.create().build();
}@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.ds-slave")
public DataSource slaveDataSource() {return DruidDataSourceBuilder.create().build();
}@Bean(name = "shardingDataSource")
@Primary
public DataSource shardingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,@Qualifier("slaveDataSource") DataSource slaveDataSource) throws SQLException {//1、指定数据源Map<String, DataSource> dataSourceMap = new HashMap<>(2);dataSourceMap.put("ds_master", masterDataSource);dataSourceMap.put("ds_slave", slaveDataSource);//2、配置读写分离规则LoadBalanceStrategyConfiguration loadBalanceStrategyConfiguration = new LoadBalanceStrategyConfiguration("RANDOM");MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration("center", "ds_master",Arrays.asList("ds_master", "ds_slave"), loadBalanceStrategyConfiguration);//3、分库分表配置ShardingRuleConfiguration shardingRuleConfig = getShardingRuleConfiguration();//4、属性配置项,可以为以下属性Properties propertie = new Properties();//是否打印SQL解析和改写日志propertie.setProperty("sql.show", Boolean.FALSE.toString());//用于SQL执行的工作线程数量,为零则表示无限制//propertie.setProperty("executor.size","8");//每个物理数据库为每次查询分配的最大连接数量propertie.setProperty("max.connections.size.per.query", "5");//是否在启动时检查分表元数据一致性propertie.setProperty("check.table.metadata.enabled", "false");//添加读写分离配置shardingRuleConfig.setMasterSlaveRuleConfigs(Collections.singletonList(masterSlaveRuleConfig));return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, propertie);
}private ShardingRuleConfiguration getShardingRuleConfiguration() {//配置各个表的分库分表策略ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();//message消息表TableRuleConfiguration messageTableRuleConfig = new TableRuleConfiguration("message", "center.message_$->{1..15}");messageTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("id", "message_$->{unid.mod(10000000000).intdiv(5000000) + 1}"));shardingRuleConfig.getTableRuleConfigs().add(messageTableRuleConfig);// person表TableRuleConfiguration personTableRuleConfig = new TableRuleConfiguration("person", "test.person_$->{1..3}");personTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("id", "person_$->{(id % 3) + 1}"));shardingRuleConfig.getTableRuleConfigs().add(personTableRuleConfig);// person_detail表TableRuleConfiguration personDetailTableRuleConfig = new TableRuleConfiguration("person_detail", "test.person_detail_$->{1..3}");personDetailTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("person_id", "person_detail_$->{(person_id % 3) + 1}"));shardingRuleConfig.getTableRuleConfigs().add(personDetailTableRuleConfig);// 设置绑定表shardingRuleConfig.getBindingTableGroups().add("person, person_detail");//  shardingRuleConfig.getBindingTableGroups().add("person_detail, person");return shardingRuleConfig;
}

}

4、启动类移除spring默认配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

5、测试

保存测试 
// 保存
@Test
void save() {PersonDO Pers5、测试onDO = new PersonDO();PersonDO.setId(IdUtil.getSnowflakeNextId());PersonDO.setName("张三");PersonDO.setSex("男");PersonDO.setAge(11);PersonDO.setDes("必读");int insert = personMapper.insert(PersonDO);System.out.println(insert);
}

在这里插入图片描述

分页测试

在这里插入图片描述

表关联测试

未设置绑定表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行sql

SELECTp.id AS id,p.NAME AS NAME,p.sex AS sex,p.age AS age,p.des AS des,d.education AS education,d.school,d.graduation_time AS graduation_time 
FROMperson pLEFT JOIN person_detail d ON p.id = d.person_id 
WHEREp.id = '1652202828696948736'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果(用一个id,查出了三份,可以在sql中也设置 d.person_id = XXXX, 但这方法有点傻,看下面方法)
在这里插入图片描述
问 : 为什么不是 3 * 3 表笛卡尔9条查询,而是三条

设置绑定表

在这里插入图片描述
结果只有一条,sql也只有一条查询
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Altera不同系列的型号命名规则

Altera芯片型号&#xff1a;10AX07H4F34I3SG 20nm工艺 资源&#xff1a; 大数据 云计算 人工智能 图像处理 MSEL

C#+uni-app医院HIS预约挂号系统源码 看病挂号快人一步

​​​​​​​ 提到去大型医院机构就诊时&#xff0c;许多人都感到恐惧。有些人一旦走进医院的门诊大厅&#xff0c;就感到迷茫&#xff0c;既无法理解导医台医生的建议&#xff0c;也找不到应该去哪个科室进行检查。实际上&#xff0c;就医也是一门学问&#xff0c;如何优化…

物联网系统运维——数据库部署,Linux环境下MySQL安装,使用phpMyAdmin管理MySQL,实验CentOS 7安装MySQL

一.MySQL 1.概要 MySQL是一种关联数据库管理系统&#xff0c;关联数据:而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性库将数据保存在不同的表中。性能高、成本低、可靠性好&#xff0c;已经成为最流行的开源数据库。 二.MySQL安装与配置 1. …

IPFoxy Tips:匿名海外代理IP的使用方法及注意事项

在互联网上&#xff0c;隐私和安全问题一直备受关注。为了保护个人隐私和数据安全&#xff0c;使用匿名代理IP是一种常用的方法。匿名代理IP可以隐藏用户的真实IP地址&#xff0c;使用户在访问网站时更加隐秘和安全。 本文将介绍匿名代理IP的基本原理和核心功能。 基本原则 匿…

算法与数据结构——时间复杂度详解与示例(C#,C++)

文章目录 1. 算法与数据结构概述2. 时间复杂度基本概念3. 时间复杂度分析方法4. 不同数据结构的时间复杂度示例5. 如何通过算法优化来提高时间复杂度6. C#中的时间复杂度示例7. 总结 算法与数据结构是计算机科学的核心&#xff0c;它们共同决定了程序的性能和效率。在实际开发中…

Redis-集群-环境搭建

文章目录 1、清空主从复制和哨兵模式留下的一些文件1.1、删除以rdb后缀名的文件1.2、删除主从复制的配置文件1.3、删除哨兵模式的配置文件 2、appendonly修改回no3、开启daemonize yes4、protect-mode no5、注释掉bind6、制作六个实例的配置文件6.1、制作配置文件redis6379.con…

数据结构——带头双向循环链表(c语言实现)

目录 1.单链表和双向链表对比 2.双向链表实现 2.1 创建新节点 2.2 链表初始化 2.3 尾插 2.4 头插 2.5 尾删 2.6 头删 2.7 查找 2.8 指定位置后插入数据 2.9 删除指定节点 2.10 销毁链表 2.11 打印链表 前言&#xff1a; 我们在前几期详细地讲解了不带头单…

数据分析python基础实战分析

数据分析python基础实战分析 安装python&#xff0c;建议安装Anaconda 【Anaconda下载链接】https://repo.anaconda.com/archive/ 记得勾选上这个框框 安装完后&#xff0c;然后把这两个框框给取消掉再点完成 在电脑搜索框输入"Jupyter"&#xff0c;牛马启动&am…

网易严选礼品卡有什么用?

网易严选的礼品卡可以在网易商城里买东西 但是现在好多人买东西基本上都用的是淘宝京东之类的 很少会有人用网易吧 但是最近我朋友送了我几张网易的卡&#xff0c;我自己也用积分兑换一张&#xff0c;一直不知道怎么用 最后还是在收卡云上转让出去了&#xff0c;价格高不说…

2024年JCR分区,将发生重大变化

科睿唯安官方微信发布消息&#xff0c;指出今年的期刊排名及相应JCR分区将发生重大变化。 原文比较长&#xff0c;不熟悉相关规则的朋友也不太容易读懂。因此&#xff0c;我们今天做一个详细的解读。 首先明确几个基本概念&#xff1a; &#xff08;1&#xff09;2024年发布2…

File类和IO流

File类和IO流 文章目录 File类和IO流[TOC](文章目录)前言一、java.io.File类&IO流原理及流的分类1.1 File类及其API1.2 IO流原理及分类 二、节点流的介绍&#xff08;字符/字节&#xff09;2.1 Reader\Writer--字符IO抽象基类2.2 FileReader\FileWriter--字符IO节点流2.3 I…

Android 多媒体开发——Media3与MediaSession最全使用指南

一、Media3库简介 1.1 Media3是什么&#xff1f; 官方释义&#xff1a; Jetpack Media3 is the new home for media libraries that enables Android apps to display rich audio and visual experiences. Media3 offers a simple architecture with powerful customization,…

Git 和 TortoiseGit 安装和配置(图文详解)

使用git&#xff0c;需要在Windows上需要安装两个软件&#xff1a;1&#xff09;Git 2&#xff09;TortoiseGit 若需要&#xff0c;可以下载TortoiseGit汉化语言包。 注意&#xff1a;tortoiseGit是在安装了Git的基础上运行的&#xff0c;所以需要先安装Git&#xff0c;后安装…

Mysql索引的实现原理,B+Tree,WAL

InnoDB 引擎&#xff0c;每一个数据表有两个文件 .frm和.ibd&#xff0c;分别为表结构&#xff0c;数据和索引&#xff0c;数据挂在主索引的叶子节点上&#xff0c;此主索引称为聚簇索引。 MyISAM 引擎&#xff0c;每一个数据表有三个文件.frm和.MYI和.MYD&#xff0c;分别为表…

深入理解计算机系统 CSAPP 家庭作业7.13

用一下496页提到的工具咯 A: whereis libm.a file lidm.a gedit libm.a libm.a是个ASCII text文件打开一看原来 libm-2.27.a 和libmvec.a才是我们要看的 所以我们cd到目标地址后 ar -t libm-2.27.a ar -t libmvec.a B: gcc -Og bar5.c foo5.c 用之前的两个文件链接后生成…

【CS.DS】数据结构 —— 图:深入了解三种表示方法之邻接表(Adjacency List)

文章目录 1 概念2 无向图的邻接表2.1 示例2.2 Mermaid 图示例2.3 C实现2.3.1 简单实现2.3.2 优化封装 2.4 总结 3 有向图的邻接表3.1 示例3.2 C实现3.3 总结 4 邻接图的遍历5 拓展补充References 数据结构 1 概念 优点&#xff1a;空间效率高&#xff0c;适合稀疏图。动态性强…

springboot 整合redis

文章目录 一、Jedis二、Lettuce三、RedisTemplate(重点)单机3.1 springboot 整合swagger3.2 序列化中文问题集群3.3 applications配置3.4 问题 一、Jedis package com.example.redis;import redis.clients.jedis.Jedis;import javax.print.DocFlavor; import java.util.*;/***…

【编译原理】绪论

1.计算机程序语言以及编译 编译是对高级语言的翻译 源程序是句子的集合&#xff0c;树可以较好的反应句子的结构 编译程序是一种翻译程序 2.编号器在语言处理系统中的位置 可重定位&#xff1a;在内存中存放的起始位置不是固定的 加载器&#xff1a;修改可重定位地址&#x…

古文字识别笔记

前置知识 部件&#xff1a;大部分的汉字是由若干组笔画结构拼合而成的&#xff0c;这些相对独立的笔画结构称为「部件」。 部件是大于基本笔画&#xff08;例如&#xff1a;点、横、撇、捺等&#xff09;而小于或等同于 偏旁 的结构单位。 例如「测」字有三个部件&#xff1a;…

【学习】使用PyTorch训练与评估自己的ResNet网络教程

参考&#xff1a;保姆级使用PyTorch训练与评估自己的ResNet网络教程_训练自己的图像分类网络resnet101 pytorch-CSDN博客 项目地址&#xff1a;GitHub - Fafa-DL/Awesome-Backbones: Integrate deep learning models for image classification | Backbone learning/comparison…