返回顶部
首页 > 资讯 > 精选 >怎么使用sharding-jdbc实现水平分表
  • 483
分享到

怎么使用sharding-jdbc实现水平分表

2023-06-25 13:06:39 483人浏览 安东尼
摘要

这篇文章主要介绍“怎么使用sharding-jdbc实现水平分表”,在日常操作中,相信很多人在怎么使用sharding-jdbc实现水平分表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用shardin

这篇文章主要介绍“怎么使用sharding-jdbc实现水平分表”,在日常操作中,相信很多人在怎么使用sharding-jdbc实现水平分表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用sharding-jdbc实现水平分表”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

mysql中新建数据库sharding_db,新增两张结构一样的表student_1和student_2。

CREATE TABLE `student_1` (`ID`  bigint(20) NOT NULL ,`NAME`  varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,`AGE`  int(11) NOT NULL ,`GENDER`  varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,PRIMARY KEY (`ID`));

此处未指定主键自增,因为两张表的id不能重复,所以只能从后端传入id。

添加依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-WEB</artifactId></dependency><!-- Druid连接池 --><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.1.20</version></dependency><!-- Mysql驱动依赖 --><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId></dependency><!-- mybatisPlus --><dependency>    <groupId>com.baomidou</groupId>    <artifactId>mybatis-plus-boot-starter</artifactId>    <version>3.0.5</version></dependency><!-- Sharding-JDBC --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>    <version>4.0.0-RC1</version></dependency><!-- lombok --><dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-test</artifactId>    <scope>test</scope></dependency><dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <scope>test</scope></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-test</artifactId>    <scope>test</scope>    <exclusions>        <exclusion>            <groupId>org.junit.vintage</groupId>            <artifactId>junit-vintage-engine</artifactId>        </exclusion>    </exclusions></dependency>

编写配置文件

spring.main.allow-bean-definition-overriding=true# 配置Sharding-JDBC的分片策略# 配置数据源,给数据源起名g1,g2...此处可配置多数据源spring.shardingsphere.datasource.names=g1# 配置数据源具体内容:连接池,驱动,地址,用户名,密码# 由于上面配置数据源只有g1因此下面只配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.passWordspring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTCspring.shardingsphere.datasource.g1.username=rootspring.shardingsphere.datasource.g1.password=123456# 配置表的分布,表的策略spring.shardingsphere.sharding.tables.student.actual-data-nodes=g1.student_$->{1..2}# 指定student表 主键gid 生成策略为 SNOWFLAKEspring.shardingsphere.sharding.tables.student.key-generator.column=idspring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE# 指定分片策略 约定id值是偶数添加到student_1表,如果id是奇数添加到student_2表spring.shardingsphere.sharding.tables.student.table-strategy.inline.sharding-column=idspring.shardingsphere.sharding.tables.student.table-strategy.inline.alGorithm-expression=student_$->{id % 2 + 1}# 打开sql输出日志spring.shardingsphere.props.sql.show=true

或者是yml格式

spring:  main:    allow-bean-definition-overriding: true  shardingsphere:    datasource:      g1:        driver-class-name: com.mysql.cj.jdbc.Driver        password: 123456        type: com.alibaba.druid.pool.DruidDataSource        url: jdbc:mysql://localhost:3306/sharding_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC        username: root      names: g1    props:      sql:        show: true    sharding:      tables:        student:          actual-data-nodes: g1.student_$->{1..2}          key-generator:            column: id            type: SNOWFLAKE          table-strategy:            inline:              algorithm-expression: student_$->{id % 2 + 1}              sharding-column: id

编写实体类

@Datapublic class Student {    private Long id;    private String name;    private int age;    private String gender;}

编写mapper接口

@Repositorypublic interface StudentMapper extends BaseMapper<Student> {}

编写测试

@SpringBootTestclass ShardingJdbcDemoApplicationTests {    @Autowired    private StudentMapper studentMapper;    @Test    public void test01() {        for (int i = 0; i < 10; i++) {            Student student = new Student();            student.setName("wuwl");            student.setAge(27);            student.setGender("男");            studentMapper.insert(student);        }    }}

执行测试

怎么使用sharding-jdbc实现水平分表

执行成功,主键通过雪花算法在后端生成,传入到数据库中,根据奇偶性进行分表。

student_1表数据:

怎么使用sharding-jdbc实现水平分表

student_2表数据:

怎么使用sharding-jdbc实现水平分表

两张表的数据分别有5条,但这只是因为雪花算法生成的id奇数偶数各5个,不是1:1的关系,需要注意。
主键生成后,根据策略插入到对应的表中,从打印出来的sql可以证明这一点。
通过mapper接口的selectById方法进行查询时,会先根据主键策略判断在哪个库,再直接去那个库根据主键查询。而如果是通过其它条件查询,或者是多个id的selectById方法查询,又是如何的呢?

@Test    public void test03() {        List<Long> list = new ArrayList<>();        list.add(1362282042768609282l);        list.add(1362282040277192705l);        List<Student> studentList = studentMapper.selectBatchIds(list);        System.out.println(studentList);    }

取了两张表的id进行查询。

怎么使用sharding-jdbc实现水平分表

执行同样的sql,在两张表中都查询一遍,再组合结果。
如果所有的id,都来自同一张表,那是否会去多个表中重复查询呢?

怎么使用sharding-jdbc实现水平分表

只执行了一遍。所以,在执行查询时,sharding会先判断是否可以确定需要的数据来自那张表,如果能,则直接去那一张表中查询数据即可,而如果不能确定,则会多个表重复查询,以确定查询结果的完整性。

到此,关于“怎么使用sharding-jdbc实现水平分表”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么使用sharding-jdbc实现水平分表

本文链接: https://lsjlt.com/news/304712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用sharding-jdbc实现水平分表
    这篇文章主要介绍“怎么使用sharding-jdbc实现水平分表”,在日常操作中,相信很多人在怎么使用sharding-jdbc实现水平分表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用shardin...
    99+
    2023-06-25
  • 如何使用sharding-jdbc实现水平分库+水平分表
    这篇文章给大家分享的是有关如何使用sharding-jdbc实现水平分库+水平分表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分库分表策略:将id为偶数的存入到库1中,奇数存入到库2中,在每个库中,再根据学生的...
    99+
    2023-06-22
  • 使用sharding-jdbc实现水平分库+水平分表的示例代码
    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,...
    99+
    2024-04-02
  • 使用sharding-jdbc实现水平分表的示例代码
    目录在mysql中新建数据库sharding_db,新增两张结构一样的表student_1和student_2。添加依赖编写配置文件编写实体类编写mapper接口编写测试类执行测试在...
    99+
    2024-04-02
  • springboot怎么配置sharding-jdbc水平分表
    这篇文章主要讲解了“springboot怎么配置sharding-jdbc水平分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot怎么配置sharding-jdbc水平分表...
    99+
    2023-06-21
  • springboot实现以代码的方式配置sharding-jdbc水平分表
    目录关于依赖shardingsphere-jdbc-core-spring-boot-startershardingsphere-jdbc-core数据源DataSource原Dat...
    99+
    2024-04-02
  • 怎么用Sharding-Jdbc进行分库分表
    这篇文章主要介绍“怎么用Sharding-Jdbc进行分库分表”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Sharding-Jdbc进行分库分表”文章能帮助大家解决问题。1. Shardin...
    99+
    2023-06-28
  • SpringBoot怎么整合sharding-jdbc实现分库分表与读写分离
    本篇内容主要讲解“SpringBoot怎么整合sharding-jdbc实现分库分表与读写分离”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么整合sharding-jdbc...
    99+
    2023-06-25
  • Java使用Sharding-JDBC分库分表进行操作
    目录主从库搭建Compose FileMaster 配置Slave 配置主从配置创建分库分表Order 1 库Order 2 库User 库Sharding-JDBC 引入Shard...
    99+
    2024-04-02
  • SpringBoot 如何使用sharding jdbc进行分库分表
    目录基于4.0版本,Springboot2.1在pom里确保有如下引用里面我profiles.active了另一个之后手工把表都建好写个测试代码需要注意一个坑基于4.0版本,Spri...
    99+
    2024-04-02
  • Mysql中怎么实现水平分表与垂直分表
    本篇文章为大家展示了Mysql中怎么实现水平分表与垂直分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。水平分表:如上图所示:另外三张表表结构是一样的  ...
    99+
    2024-04-02
  • mysql中怎么实现水平分表和垂直分表
    本篇文章为大家展示了mysql中怎么实现水平分表和垂直分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 什么是数据库分区? 数据库分区是一种物理数据库设计技术...
    99+
    2024-04-02
  • Sharding-Jdbc 自定义复合分片的实现(分库分表)
    目录Sharding-JDBC的数据分片策略分片键分片算法分片策略SQL Hint实战–自定义复合分片策略小结Sharding-JDBC中的分片策略有两个维度,分别是: 数...
    99+
    2024-04-02
  • SpringBoot中怎么利用Sharding-JDBC实现MySQL8读写分离
    这篇文章将为大家详细讲解有关SpringBoot中怎么利用Sharding-JDBC实现MySQL8读写分离,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一.前言这是一个基于SpringBo...
    99+
    2023-06-20
  • mysql如何实现水平分表
    mysql如何实现水平分表?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!Mysql表数据一般达到百万级别,查询效率会很低,...
    99+
    2024-04-02
  • SpringBoot整合sharding-jdbc实现自定义分库分表的实践
    目录一、前言二、简介1、分片键2、分片算法三、程序实现一、前言 SpringBoot整合sharding-jdbc实现分库分表与读写分离 本文将通过自定义算法来实现定制化的分库分表来...
    99+
    2024-04-02
  • Mysql中如何实现水平分表
    本篇文章给大家分享的是有关Mysql中如何实现水平分表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.  &...
    99+
    2024-04-02
  • SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例
    目录一、前言二、数据库表准备三、整合四、docker-compose部署mysql主从五、本文案例demo源码一、前言 本文将基于以下环境整合sharding-jdbc实现分库分表与...
    99+
    2024-04-02
  • SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表
    小编给大家分享一下SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、水平分割1、水平分库1)、概念:以字段为依据,按照一定策略,将一个库中的数据...
    99+
    2023-06-02
  • SpringBoot整合sharding-jdbc实现自定义分库分表的方法是什么
    这篇文章主要讲解了“SpringBoot整合sharding-jdbc实现自定义分库分表的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot整合sharding-j...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作