资讯专栏INFORMATION COLUMN

Sharding-JDBC介绍及应用总结

IT那活儿 / 1869人阅读
Sharding-JDBC介绍及应用总结
初识Sharding-JDBC

  • Sharding Sphere是一套开源的分布式数据库中间件解决方案。而   sharding-jdbc是ShardingSphere的其中一个模块,它定位为轻量级Java框架, 在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
  • Sharding-JDBC 主要作用:简化对分库分表之后数据相关操作


Sharding-JDBC 分库分表操作


Sharding-JDBC水平分表

搭建环境

(1)技术:SpringBoot 2.2.1+ MyBatisPlus + Sharding-JDBC + Druid 连接池

(2)创建 SpringBoot 工程

(3)引入需要的依赖

</>复制代码

  1. <dependencies> 
    <dependency> 
    <groupId>org.springframework.bootgroupId
    <artifactId>spring-boot-starterartifactId
    dependency
    <dependency> 
    <groupId>org.springframework.bootgroupId
    <artifactId>spring-boot-starter-testartifactId
    dependency
    <dependency> 
    <groupId>com.alibabagroupId
    <artifactId>druid-spring-boot-starterartifactId
    <version>1.1.20version
    dependency
    <dependency> 
    <groupId>mysqlgroupId
    <artifactId>mysql-connector-javaartifactId
    dependency
    <dependency> 
    <groupId>org.apache.shardingspheregroupId
    <artifactId>sharding-jdbc-spring-boot-starterartifactId
    <version>4.0.0-RC1version
    dependency
    <dependency> 
    <groupId>com.baomidougroupId
    <artifactId>mybatis-plus-boot-starterartifactId
    <version>3.0.5version
    dependency
    <dependency> 
    <groupId>org.projectlombokgroupId
    <artifactId>lombokartifactId
    dependency
    dependencies>


按照水平分表的方式,创建数据库和数据库表

1)创建数据库 course_db

(2)在数据库创建两张表 course_1 和 course_2

(3)约定规则:如果添加课程 id 是偶数把数据添加 course_1,如果奇数添加到 course_2

配置Sharding-JDBC分片策略

在项目 application.properties 配置文件中进行配置

# shardingjdbc 分片策略
# 配置数据源,给数据源起名称

</>复制代码

  1. spring.shardingsphere.datasource.names=m1
# 一个实体类对应两张表,覆盖

</>复制代码

  1. spring.main.allow-bean-definition-overriding=true

</>复制代码

#配置数据源具体内容,包含连接池,驱动,地址,用户名和密码

</>复制代码

  1. spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSourc
    e 
    spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/course_db?
    serverTimezone=GMT%2B8
    spring.shardingsphere.datasource.m1.username=root
    spring.shardingsphere.datasource.m1.password=root
#指定 course 表分布情况,配置表在哪个数据库里面,表名称都是什么 m1.course_1 ,m1.course_2

</>复制代码

  1. spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$-
    >{1..2}
# 指定 course 表里面主键 cid 生成策略 SNOWFLAKE

</>复制代码

  1. </>复制代码

    spring.shardingsphere.sharding.tables.course.key-generator.column=cid
    spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 指定分片策略 约定 cid 值偶数添加到 course_1 表,如果 cid 是奇数添加到 course_2表

</>复制代码

  1. </>复制代码

    spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding
    column=cid
    spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm
    expression=course_$->{cid % 2 + 1}

# 打开 sql 输出日志

</>复制代码

  1. </>复制代码

    spring.shardingsphere.props.sql.show=true

编写测试代码

</>复制代码

  1. </>复制代码

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public classShardingjdbcdemoApplicationTests {
    //注入 mapper
    @Autowired
    privateCourseMappercourseMapper;
    //添加课程的方法
    @Test
    public voidaddCourse() {
    for(inti=1;i<=10;i++) {
    Course course =newCourse();
    course.setCname("java"+i);
    course.setUserId(100L);
    course.setCstatus("Normal"+i);
    courseMapper.insert(course);
    }
    }
    //查询课程的方法
    @Test
    public voidfindCourse() {
    QueryWrapper wrapper =newQueryWrapper<>();
    wrapper.eq("cid",465114665106538497L);
    Course course =courseMapper.selectOne(wrapper);
    System.out.println(course);
    }
    }

(1)上面测试代码执行,报错了

(2)解决方案,在配置文件中添加一行配置

</>复制代码

  1. # 一个实体类对应两张表,覆盖

</>复制代码

  1. </>复制代码

    spring.main.allow-bean-definition-overriding=true




Sharding-JDBC实现水平分库


数据库搭建

创建两个数据库db1和db2,每个数据库创建两张表tab1和tab2,每个表中包括两个字段cid和userId。

数据库规则:userId为偶数则添加到db1数据库,为奇数列则添加到db2数据库。
表规则:cid为偶数列则添加到tab1,为奇数则添加到表tab2。

在Spring boot配置文件配置数据库分片规则


# shardingjdbc 分片策略# 配置数据源,给数据源起名称,
# 水平分库,配置两个数据源

</>复制代码

  1. </>复制代码

    1. </>复制代码

      spring.shardingsphere.datasource.names=m1,m2
# 一个实体类对应两张表,覆盖

</>复制代码

  1. </>复制代码

    1. </>复制代码

      spring.main.allow-bean-definition-overriding=true
#配置第一个数据源具体内容,包含连接池,驱动,地址,用户名和密码

</>复制代码

  1. </>复制代码

    spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSourc
    e
    spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/edu_db_1?s
    erverTimezone=GMT%2B8
    spring.shardingsphere.datasource.m1.username=root
    spring.shardingsphere.datasource.m1.password=root

#配置第二个数据源具体内容,包含连接池,驱动,地址,用户名和密码

</>复制代码

  1. </>复制代码

    spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSourc
    e
    spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/edu_db_2?s
    erverTimezone=GMT%2B8
    spring.shardingsphere.datasource.m2.username=root
    spring.shardingsphere.datasource.m2.password=root

#指定数据库分布情况,数据库里面表分布情况

# m1 m2 course_1 course_2

</>复制代码

  1. </>复制代码

    spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$-
    >{1..2}.course_$->{1..2}

# 指定 course 表里面主键 cid 生成策略 SNOWFLAKE

</>复制代码

  1. </>复制代码

    spring.shardingsphere.sharding.tables.course.key-generator.column=cid
    spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

# 指定表分片策略 约定 cid 值偶数添加到 course_1 表,如果 cid 是奇数添加到course_2 表

</>复制代码

  1. </>复制代码

    spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding
    column=cid
    spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm
    expression=course_$->{cid % 2 + 1}

# 指定数据库分片策略 约定 user_id 是偶数添加 m1,是奇数添加 m2

</>复制代码

  1. </>复制代码

    #spring.shardingsphere.sharding.default-database-strategy.inline.sharding
    column=user_id
    #spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-
    expression=m$->{user_id % 2 + 1}
    spring.shardingsphere.sharding.tables.course.database
    strategy.inline..sharding-column=user_id
    spring.shardingsphere.sharding.tables.course.database
    strategy.inline.algorithm-expression=m$->{user_id % 2 + 1}

# 打开 sql 输出日志

</>复制代码

  1. </>复制代码

    spring.shardingsphere.props.sql.show=true

编写测试方法

</>复制代码

  1. </>复制代码

    1. </>复制代码

      //======================测试水平分库=====================
      //添加操作
      @Test
      public voidaddCourseDb() {
      Course course =newCourse();
      course.setCname("javademo1");
      //分库根据 user_id
      course.setUserId(111L);
      course.setCstatus("Normal1");
      courseMapper.insert(course);
      }
      //查询操作
      @Test
      public voidfindCourseDb() {
      QueryWrapper wrapper =newQueryWrapper<>();
      //设置 userid 值
      wrapper.eq("user_id",100L);
      //设置 cid 值
      wrapper.eq("cid",465162909769531393L);
      Course course =courseMapper.selectOne(wrapper);
      System.out.println(course);
      }



Sharding-JDBC实现读写分离


Sharding-JDBC 通过 sql 语句语义分析,实现读写分离过程,不会做数据同步

Sharding-JDBC 操作

配置读写分离策略

# user_db 从服务器

</>复制代码

  1. </>复制代码

    spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSourc
    e 
    spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.s0.url=jdbc:mysql://localhost:3307/user_db?se 
    rverTimezone=GMT%2B8
    spring.shardingsphere.datasource.s0.username=root spring.shardingsphere.datasource.s0.password=root

# 主库从库逻辑数据源定义 ds0 为 user_db

</>复制代码

  1. </>复制代码

    1. </>复制代码

      spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source
      name=m0
      spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source
      names=s0
# 配置 user_db 数据库里面 t_user 专库专表
#spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=m$->{0}.t_user
# t_user 分表策略,固定分配至 ds0 的 t_user 真实表

</>复制代码

  1. </>复制代码

    spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds0.t_user


编写测试代码

</>复制代码

  1. </>复制代码

    1. //添加操作
      @Test
      public voidaddUserDb() {
      User user =newUser();
      user.setUsername("lucymary");
      user.setUstatus("a");
      userMapper.insert(user);
      }
      //查询操作
      @Test
      public voidfindUserDb() {
      QueryWrapper wrapper =newQueryWrapper<>();
      //设置 userid 值
      wrapper.eq("user_id",465508031619137537L);
      User user =userMapper.selectOne(wrapper);
      System.out.println(user);
      }



END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129943.html

相关文章

  • database

    摘要:它是第一个把数据分布在全球范围内的系统,并且支持外部一致性的分布式事务。目的是使得开发者阅读之后,能对项目有一个初步了解,更好的参与进入的开发中。深度探索数据库并发控制技术并发控制技术是数据库事务处理的核心技术。 存储过程高级篇 讲解了一些存储过程的高级特性,包括 cursor、schema、控制语句、事务等。 数据库索引与事务管理 本篇文章为对数据库知识的查缺补漏,从索引,事务管理,...

    csRyan 评论0 收藏0
  • 当当弹性化中间件云化之路(据说读完可以少踩坑)

    摘要:第二部分介绍当当的弹性化中间件。第三部分当当的云化之路。下面部分是为当当运营人员与合作伙伴提供的系统,如商品价格库存等。下图是当当的监控系统以及限流系统的。当当采用的作业中间件是自研的,它可以将一个完整的作业拆分为多个相互独立的任务。 showImg(https://segmentfault.com/img/remote/1460000009999152); 6月24日,双态运维·乌镇...

    王陆宽 评论0 收藏0
  • java篇

    摘要:多线程编程这篇文章分析了多线程的优缺点,如何创建多线程,分享了线程安全和线程通信线程池等等一些知识。 中间件技术入门教程 中间件技术入门教程,本博客介绍了 ESB、MQ、JMS 的一些知识... SpringBoot 多数据源 SpringBoot 使用主从数据源 简易的后台管理权限设计 从零开始搭建自己权限管理框架 Docker 多步构建更小的 Java 镜像 Docker Jav...

    honhon 评论0 收藏0
  • Sharding-Jdbc实现mysql分库分表

    摘要:实现数据库分库分表可以自己实现,也可以使用和实现。分布式数据库的自增不是自增的。分布式数据库分页查询需要使用插入时间实现。包含分库分片和读写分离功能。 Sharding-Jdbc实现mysql分库分表 简单介绍 数据库分库分表和读写分离区别,分库分表是在多个库建相同的表和同一个库建不同的表,根据随机或者哈希等方式查找实现。读写分离是为了解决数据库的读写性能不足,使用主库master进行...

    go4it 评论0 收藏0
  • springboot实践笔记之一:springboot+sharding-jdbc+mybatis全

    摘要:现在的分片策略是上海深圳分别建库,每个库都存各自交易所的两支股票的,且按照月分表。五配置分片策略数据库分片策略在这个实例中,数据库的分库就是根据上海和深圳来分的,在中是单键分片。 由于当当发布了最新的Sharding-Sphere,所以本文已经过时,不日将推出新的版本 项目中遇到了分库分表的问题,找到了shrding-jdbc,于是就搞了一个springboot+sharding-jd...

    Snailclimb 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<