返回顶部
首页 > 资讯 > 后端开发 > Python >使用sharding-jdbc实现水平分表的示例代码
  • 911
分享到

使用sharding-jdbc实现水平分表的示例代码

2024-04-02 19:04:59 911人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录在Mysql中新建数据库sharding_db,新增两张结构一样的表student_1和student_2。添加依赖编写配置文件编写实体类编写mapper接口编写测试类执行测试在

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.passWord
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=123456

# 配置表的分布,表的策略
spring.shardingsphere.sharding.tables.student.actual-data-nodes=g1.student_$->{1..2}

# 指定student表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.student.key-generator.column=id
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE

# 指定分片策略 约定id值是偶数添加到student_1表,如果id是奇数添加到student_2表
spring.shardingsphere.sharding.tables.student.table-strategy.inline.sharding-column=id
spring.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

编写实体类


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

编写mapper接口


@Repository
public interface StudentMapper extends BaseMapper<Student> {

}

编写测试类


@SpringBootTest
class 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);
        }
    }
}

执行测试

在这里插入图片描述

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

student_1表数据:

在这里插入图片描述

student_2表数据:

在这里插入图片描述

两张表的数据分别有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进行查询。

在这里插入图片描述

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

在这里插入图片描述

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

到此这篇关于使用sharding-jdbc实现水平分表的示例代码的文章就介绍到这了,更多相关sharding-jdbc 水平分表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用sharding-jdbc实现水平分表的示例代码

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

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

猜你喜欢
  • 使用sharding-jdbc实现水平分表的示例代码
    目录在mysql中新建数据库sharding_db,新增两张结构一样的表student_1和student_2。添加依赖编写配置文件编写实体类编写mapper接口编写测试类执行测试在...
    99+
    2024-04-02
  • 使用sharding-jdbc实现水平分库+水平分表的示例代码
    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,...
    99+
    2024-04-02
  • 如何使用sharding-jdbc实现水平分库+水平分表
    这篇文章给大家分享的是有关如何使用sharding-jdbc实现水平分库+水平分表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分库分表策略:将id为偶数的存入到库1中,奇数存入到库2中,在每个库中,再根据学生的...
    99+
    2023-06-22
  • 怎么使用sharding-jdbc实现水平分表
    这篇文章主要介绍“怎么使用sharding-jdbc实现水平分表”,在日常操作中,相信很多人在怎么使用sharding-jdbc实现水平分表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用shardin...
    99+
    2023-06-25
  • springboot实现以代码的方式配置sharding-jdbc水平分表
    目录关于依赖shardingsphere-jdbc-core-spring-boot-startershardingsphere-jdbc-core数据源DataSource原Dat...
    99+
    2024-04-02
  • Mysql实现水平分库的示例代码
    目录前言:讲解:第一种方式的水平分库:mysql水平分库数据查询合并MySQL水平分库插入数据前言: 平时开发中,可能会遇见数据量越来越大的情况,一般数据量过千万级别,就必须考虑分库分表的情况了,来减少io 服务器压力,...
    99+
    2023-06-08
    Mysql 水平分库
  • Sharding-JDBC自动实现MySQL读写分离的示例代码
    目录一、ShardingSphere和Sharding-JDBC概述1.1、ShardingSphere简介 1.2、Sharding-JDBC简介1.3、Sharding...
    99+
    2024-04-02
  • Python使用Qt5实现水平导航栏的示例代码
    在 Qt5 中可以使用 QWidget 包含两个水平布局,通过点击水平布局里的按钮,实现下标滑动与页面的切换。 可以按照以下步骤来实现上面图片中的功能: 导入必要的 Qt 包: f...
    99+
    2023-03-06
    Qt5 水平导航栏 Qt5 导航栏
  • SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例
    目录一、前言二、数据库表准备三、整合四、docker-compose部署mysql主从五、本文案例demo源码一、前言 本文将基于以下环境整合sharding-jdbc实现分库分表与...
    99+
    2024-04-02
  • Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写
    Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、ShardingSphere和Shard...
    99+
    2023-06-25
  • 利用Sharding-Jdbc进行分库分表的操作代码
    目录1.Sharding-Jdbc介绍2.Sharding-Jdbc引入使用3.配置广播表4.配置绑定表5.读写分离配置1. Sharding-Jdbc介绍 https://shar...
    99+
    2024-04-02
  • vue实现两列水平时间轴的示例代码
    目录一、实现组件timelineH.vue 二、调用组件 本文主要介绍了vue实现两列水平时间轴的示例代码,分享给大家,具体如下: 先上图,主要实现两列水平时间轴,查看了很多人实现...
    99+
    2024-04-02
  • Sharding-Jdbc 自定义复合分片的实现(分库分表)
    目录Sharding-JDBC的数据分片策略分片键分片算法分片策略SQL Hint实战–自定义复合分片策略小结Sharding-JDBC中的分片策略有两个维度,分别是: 数...
    99+
    2024-04-02
  • mybatis水平分表实现动态表名的项目实例
    目录一、水平分表二、项目实现目录结构三、扩展一、水平分表 当业务需求的数据量过大时,一个表格存储数据会非常之多,故时长采用水平分表的方式来减少每张表的数据量即是提升查询数据库时的效率...
    99+
    2024-04-02
  • SpringBoot整合sharding-jdbc实现自定义分库分表的实践
    目录一、前言二、简介1、分片键2、分片算法三、程序实现一、前言 SpringBoot整合sharding-jdbc实现分库分表与读写分离 本文将通过自定义算法来实现定制化的分库分表来...
    99+
    2024-04-02
  • Python+OpenCV实现分水岭分割算法的示例代码
    目录前言1.使用分水岭算法进行分割2.Watershed与random walker分割对比前言 分水岭算法是用于分割的经典算法,在提取图像中粘连或重叠的对象时特别有用,例如下图中的...
    99+
    2024-04-02
  • springboot实现mock平台的示例代码
    目录一、实现场景:1.1请求同一个接口,不同的传参/ip返回的结果不一样。1.2 返回的结果不是写死的,是动态数据,需要对数据进行处理1.3 回调能力1.4响应时间1.5 hook参...
    99+
    2024-04-02
  • 使用JDBC实现数据访问对象层(DAO)代码示例
    JAVA是面向对象的语言,开发者在操作数据的时候,通常更习惯面对一个特定类型的对象,如一个用户就是一个User类的对象。DAO层需要做的,就是为上层提供充分的对象支持,让上层再也看不到具体的数据,而是一个个活生生的对象。增加,删除,查询和修...
    99+
    2023-05-31
    jdbc dao
  • SpringBoot集成Sharding Jdbc使用复合分片的实践
    目录1、Sharing JDBC 简介2、系统改造2.1 对接外部系统的系统2.2 内部系统间的调用3、解决方案4、代码实现4.1 Sharding JDBC 配置4.2 数据源操作...
    99+
    2024-04-02
  • SpringBoot使用Sharding-JDBC实现数据分片和读写分离的方法
    目录一、Sharding-JDBC简介二、具体的实现方式 1、maven引用2、数据库准备3、Spring配置4、精准分片算法和范围分片算法的Java代码5、测试一、Sha...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作