ShardingSphere学习

ShardingSphere学习,第1张

ShardingSphere学习 ShardingSphere

Apache ShardingSphere 由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的基于数据库作为存储节点的增量功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

分库分表的概念

分库分表的两种方式:垂直切分和水平切分

垂直切分

垂直分表

将数据库中的一张表部分字段存储到一张表中,再把这张表中的另外一部分字段存储到另外一张表中,对数据列进行拆分

垂直分库

把单一数据库按照业务划分到不同的数据库,不同模块对应不同数据库

水平切分

水平分表

在同一数据库中,建立多张相同的表,表结构一致

水平分库

将数据库创建多个相同结构的数据库

ShardingSphere-JDBC

定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;

  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;

  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库。

使用shardingsphere-jdbc实现垂直分表

docker安装mysql

  • 查询镜像

    docker search mysql

  • 获取最新镜像

    docker pull mysql:latest

  • 查看镜像

    docker images

  • 编写shell脚本mysql.sh

    #!/bin/bash
    docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

  • 执行脚本

    ./mysql.sh

创建数据库与表结构

  • 建表语句

    CREATE TABLE `student_0` (
      `id` bigint NOT NULL,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      `age` int NOT NULL,
      `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    CREATE TABLE `student_1` (
      `id` bigint NOT NULL,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
      `age` int NOT NULL,
      `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

创建项目

  • 导入依赖

    
        org.springframework.boot
        spring-boot-starter
    
        mysql
        mysql-connector-java
        runtime
    
    
        org.projectlombok
        lombok
        true
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.4.3.4
    
        com.baomidou
        mybatis-plus-generator
        3.4.1
    
        org.freemarker
        freemarker
        2.3.31
    
        org.apache.shardingsphere
        sharding-jdbc-spring-boot-starter
        4.1.1
    

  • 创建实体类与对应实体的mapper 文件

  • 配置文件进行配置

    # 真实数据源名称,多个数据源用逗号区分
    spring.shardingsphere.datasource.names= ds1
    ​
    ​
    # 配置第 1 个数据源
    spring.shardingsphere.datasource.ds1.type= com.zaxxer.hikari.HikariDataSource
    spring.shardingsphere.datasource.ds1.driver-class-name= com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.ds1.jdbc-url= jdbc:mysql://172.28.93.158:3306/shardingsphere?serverTimezone=GMT%2B8
    spring.shardingsphere.datasource.ds1.username= root
    spring.shardingsphere.datasource.ds1.password= root
    ​
    # 指定表的分布情况,配置表在哪儿数据库里,表名称都是什么 ds1.student_0 ds1.student_1
    spring.shardingsphere.sharding.tables.student.actual-data-nodes= ds1.student_$->{0..1}
    ​
    # 指定student表里的主键id 生成策略 SNOWFLAKE
    spring.shardingsphere.sharding.tables.student.key-generator.column= id
    spring.shardingsphere.sharding.tables.student.key-generator.type= SNOWFLAKE
    ​
    # 指定分片策略 约定偶数添加到student_0 奇数添加到student_1
    spring.shardingsphere.sharding.tables.student.table-strategy.inline.sharding-column= id
    spring.shardingsphere.sharding.tables.student.table-strategy.inline.algorithm-expression= student_$->{id%2}
    ​
    spring.shardingsphere.props.sql.show= true
    
    
  • 测试类

    @Test
    void contextLoads() {
        for (int i = 1; i < 11; i++) {
            studentMapper.insert(new Student().setName("zhangsan"+i).setAge(18+i).setAddress("beijing"+i));
        }
    }
    
    @Test
    void testSelect(){
    
        studentMapper.selectById(1469979914989998081L);
    
        studentMapper.selectById(1469979919918305282L);
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5661008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存