ShardingSphere-Sharding-JDBC水平分库(1) | 学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 快速学习ShardingSphere-Sharding-JDBC水平分库(1)。

开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-Sharding-JDBC水平分库(1)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/666/detail/11248


ShardingSphere-Sharding-JDBC 水平分库(1)

 

内容介绍:

一.需求分析

二.创建数据库和表

三.在SpringBoot 配置文件配置数据库分片规则

四.编写测试方法

 

上节课程讲到 Sharding-JDBC 实现水平分表操作,通过创建工程环境,创建数据库配置分片策略,最终编写测试代码完成Sharding-JD

BC 实现水平分表。继续使用 Sharding-JDBC 实现水平分库操作。


一.需求分析

使用 Sharding-JDBC 已经实现水平分表操作,现在 Sharding-JDBC 实现水平分库操作。水平分库即把单一数据库创建为多个与其结构相同的数据库,在第一个数据库中存放一部分数据,第二个中存放另一部分数据即创建多个结构相同数据库,数据库中的表均相同。按照这种方式进行操作,首先需求分析即想要实现什么样的效果,分析需求后通过代码实现。因为要实现水平分库,需要创建两个数据库(以两个数据库举例,可以创建多个数据库),为了区分数据库对数据库命名,在之前已经创建 course_db ,现在创建第一个数据库命名为 edu_db_1,创建第二个数据库命名为 edu_db_2,这是即将创建的两个数据库;创建数据库后,在数据库中创建表,表结构与上节课程相同;在数据库 edu_db_1 中创建两个表,第一个表名为 course_1,第二个表名为course_2,把两个表按照上节课程课程中表结构创建出;在数据库edu_db_2 中同样创建表结构相同的两张表;这是数据库与表规划的方式。复述一遍:创建两个数据库 edu_db_1edu_db_2,在数据库中有相同的两张表 course_1course_2.实现工程时约定规则:现在进行水平分库,在数据库中进行了水平分表,把两个操作放在一起混合编写,规则稍微复杂一点。数据库规则:第一个规则,在添加课程时课程表中存在字段 user_id,如果 user_id 为偶数时把数据添加到 edu_db_1 数据库中,,如果 user_id 为奇数时把数据添加到 edu_db_2 数据库中;再添加表的规则,表规则与上节课程相同,现在只判断数据添加在那个数据库,数据最终需要添加到表中,在表中有 cid 值。表规则:cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中。这是对需求的分析。

复述一遍需求分析,把表创建,编写代码。首先创建两个数据库edu_db_1 edu_db_2;数据库中均存放两张表 course_1 course_2 ,它们结构相同;规则是两种规则一个数据库规则一个表规则,数据库规则是当user_id 为奇数时把数据添加到 edu_db_2 数据库中,当 user_id 为偶数时把数据添加到 edu_db_1 数据库中;表规则是在添加数据时cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中。即可实现水平分库的存在。

6.1.png

 

使用 Shard ing-JDBC实现水平分库效果,通过描述知道最终需要做成的效果,所以把需求进行分析。


二.创建数据库和表

根据需求分析,创建数据库和数据库表。首先创建两个数据库 edu_db_1

6.2.png

edu_db_2

6.3.png

在两个数据库中创建两个表 course_1 course_2 ,使用语句

CREATE  TABLE course_1{

Cid BIGINT20 PRIMARY KEY

Cname VARCHAR(50) NOT NULL;

User_id BIGINT(20)  NOT NULL;

Cstatus VARCHAR(20) NOT NULL;

}

创建表 course_1 然后在创建 course_2

CREATE  TABLE course_2{

Cid BIGINT20 PRIMARY KEY

Cname VARCHAR(50) NOT NULL;

User_id BIGINT(20)  NOT NULL;

Cstatus VARCHAR(20) NOT NULL;

}

在数据库 edu_db_1 中两个表就已经创建完成,在数据库 edu_db_2 中同样创建两个表 course_1 course_2。目前两个数据库已经创建,在数据库中均有两个表 course_1 course_2

6.4.png

三.在 SpringBoot 配置文件配置数据库分片规则

按照水平分库特点创建数据库和数据库表,创建完成后开始编写代码,把过程实现,在上节课中已经把代码结构编写出了,下面只需要更改配置文件增加数据库的分片规则,编写测试方法进行测试。

在前面课程已经编写配置文件,为了区分把文件复制一份,把文件 application.properties备份,然后在 application.properties 中完成具体操作,在文件中修改为水平分库需要的配置。当前文件中有上次课程中水平分表的策略,现在需要添加水平分库的策略,从官网中寻找示例进行修改;第一步在配置文件中创建数据源,做水平分库需要两个数据源,之前有一个数据源 m1,再添加一个数据源 m2 写法可以参考官网;第二部配置数据源中具体内容,配置第一个数据源具体内容:

spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.m1.ur1=jdbc:mysql://localhost:3306/edu_db_1?serverTimezone=GMT%2B8

spring.shardingsphere.datasource.m1.username=root

spring.shardingsphere.datasource.m1.password=root

数据库地址改为 edu_db_1,

配置第二个数据源具体内容:spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasourcem2.ur1=jdbc:mysql://localhost:3306/edu_db_2?serverTimezone=GMT%2B8

spring.shardingsphere.datasource.m2.username=root

spring.shardingsphere.datasource.m2.password=root

首先把数据源名称修改为 m2,数据库名称修改为 edu_db_2

现在把数据源部分配置完成,数据源共两个 m1m2.

编写数据库分布情况包括数据库表分布情况,再上节课中只配置了一个数据源 m1,当时没有水平分库现在既要有库的分布还有有表的分布。指定数据库分布情况,数据库里面表分布情况,设置规则。目前有两个数据源 m1m2 再数据库中有两张表course_1 course_2。当前配置文件中已经把表配置完成,需要把 m1 位置更换为分布规则,参考官网文档,把它复制然后修改为理想的效果。案例中数据源叫ds,应修改为 m;把 0..1 修改为 1..2,这样就配置数据库色分布情况

#定数据库分布情况,数据库里面表分布情况
#m1  m2 course_1  course_2

Spring.shardingphere.sharding.tables.course.actual-data-bodes=m$->{1..2}.course_$->{1..2}

数据库中有两个数据源 m1 m2,数据库中表有course_1 course_2

Course 表中 cid 生成策略无需更改。

表的策略:cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中,分片规则在之前已经编写。

#指定 course 表里面主键生成策略 SNOWFLAKspring.shardingsphere.sharding.tables.t_order.key=generator.column=order_idspring.shardingsphere.sharding.tables.t_order.key=generator.type=SNOWFLAKE

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

spring.shardingsphere.sharding.tables.t_crder.table-strategy.inline.sharding-column=order_id

spring.shardingsphere.sharding.tables.t_crder.table-strategy.inline.algorithm-expression=t _order$->{order _id % 2+1)

cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中;对 2 取模,如果 cid 可以整除 2 把数据存放到 course_1,如果 cid 不能整除 2 则把数据存放到 course_2

现在不只有表,还有两个数据库需要多加一个配置,指定数据库分片策略。数据库策略在需求分析时也做了约定:如果user_id 是偶数添加到 m1 数据库中,如果 user_id 是奇数添加 m2数据库中。策略可以在官网中查找案例,第一个写法根据那个字段做策略,字段使用的是 user_id,第二行是策略具体内容;如果user_id 是偶数添加到 m1 数据库中,如果 user_id 是奇数添加 m2数据库中。

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}

这样编写没有问题,但写法中有一个单词 default 即默认的,就是数据库所以表都按照此规则做,如果想要指定特定表做,可以使用下面语句。此配置并无错误,但可以进行简化:ing.shardingspher

e.sharding 不变,后面改为 tables tables后添加表的规则 course,再添加数据库策略 database-strategy.再加上inline 后面一致;spring.shardingsphere.sharding.tables.course.databa

se-strategy.inline..sharding-column=user_id

这段代码含义:对数据库中 course 策略的字段 user_id 做分片规则,如果其他表中同样有字段 user_id 但不做编写的规则,只有策略为 course 的表做编写规则。第二行代码与默认写法相同 spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m->(user_id %2+ 1}

现在已经完成水平分库的策略配置,再策略中第一步配置数据源,现在做水平分库有两个数据源 m1 m2;第二步配置数据源具体内容;第三步设置数据库与表的分布情况,现在有两个数据库 m1m2 和两个表course_1,course_2;第四步设置 course 表中主键 cid 的策略使用雪花算法 SNOWFLAKE;第五步指定表的分片策略,cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中;第六步指定数据库分片策略,根据 user_id 做判断,有两种写法,一个是默认写法 default 一个是指定写法tables,如果 user_id 是偶数添加到 m1 数据库中,如果 user_id 是奇数添加m2 数据库中;最后输出 sql 日志。这样即可完成水平分库的配置,配置代码不需要记忆,再官网上都有对应代码,但要知道每一行配置具体含义,根据过程可以配置出来。


四.编写测试方法

完成数据库分片规则配置,最后一步编写测试代码,测试最终效果。在测试文件中,先写添加代码,其中有两个值需要注意一个是 user_id 一个是课程 id course,根据它们进行判断。再做查询测试,根据 课程 id course user_id 分别查看效果,根据规则操作不同的表。例如 cid 值为 2user_id 等于11,第一个 user_id 是奇数会把数据添加到 edu_db_2 中,cid 是偶数会把数据添加到 edu_db_2 course_1  表中。配置最终完成了。

 

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
65 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
4月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
191 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
SQL 算法 Java
Myqsql使用Sharding-JDBC分表分库和读写分离 2
Myqsql使用Sharding-JDBC分表分库和读写分离
158 0
|
4月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
45 6
|
4月前
|
存储 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
82 4
|
4月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(中)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
42 3
|
SQL 算法 Java
Myqsql使用Sharding-JDBC分表分库和读写分离 1
Myqsql使用Sharding-JDBC分表分库和读写分离
110 0
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
72 0
|
SQL druid Java
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(四)
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(四)