开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-Sharding-JDBC(垂直切分)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/666/detail/11250
ShardingSphere-Sharding-JDBC (垂直切分)
内容介绍:
一、简介
二、Sharding-JDBC 实现垂直分库
三、检验
一、简介
下面采用 Sharding-JDBC 实验垂直切分方式来应用,比如垂直分库。
垂直分库是指根据业务把数据库划分成多个独立的数据库,有独立的表,真正做到专库专表或专库专用。比如教育项目中,在课程数据库中有课程基本信息表和课程描述表,订单数据库中有订单表,就叫作专库分表,垂直分库。
二、Sharding-JDBC实现垂直分库
使用 Sharding-JDBC 实验垂直切分方式实现垂直分库,使用需求分析来达到效果。
1.需求分析
比如有很多数据库。第一个数据库叫user_db用户库,第二个数据库叫course_db数据库,第三个叫 order_db订单数据库。以第一个为例,里边有t_user用户表,在别的数据库中又对应到不同的表,这是垂直分库,专库专表专库专用。比如现在查询用户信息,到 user_db中找t_user表查出信息。要添加用户信息时,到 user_db 中 向 t_user 表添加数据。
它只操作用户信息,不可能去操作课程数据库,也不会操作订单数据库,只操作user_db库中的t_user表,就叫垂直分库,专库分表。
下面按照过程,做到专户专表。
2. 创建数据库和表
首先删除之前创建的文件,创建 user_db数据库,之后创建表。
表包含的字段:
第一个 user_id,定义运算类型 bigint,长度设置20,设置主键。
第二个包含 username 用户名称,定义运算类型 varchar,长度设置100。
第三个字段,userstatus 用户状态,定义运算类型 varchar,长度设置50。
t_user 表构建完成。
现在完成了创建 user_db 数据库,内含 t_user数据表,然后用 Sharding-JDBC实现专库专表。当操作用户信息时,只操作库中的 t_user表,不会操作其它库中的其它表。
3.编写操作代码
代码结构不需要额外变化,按照之前过程使用。
编写操作代码首先注意,因为现要操作新的数据库,之前的工程课程包括课程的maple是一类。现在要对应 user 实体类,还有mapper,包括检查相关配置,所以先要创建 user 实体类和 mapper。
(1)创建 user 实体类和 mapper
首先在 entity 下,新建文件,文件名User,写入User属性:user_id、user name、ustatus。
输入private Long userId;
private String username;
private String ustatus;
添加注解@Data,生成它的方法,实体类创建完成。
在 mapper 中创建针对 user 操作 mapper 的Interface,取名 UserMapper,让它继承BaseMapper 类
表的名字为 t_user,因为规则不同,User 实体类识别不出其对应的表,需要指定 user类。
引入依赖,添加 @Repository 注解。
Import com.atguigu.shardingjbcdemo.entity.User;
Import com.baomidou.mybatisplus.core.mapper.BaseMapper;
Import org.springfranework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User>{
}
所以user 实体类和 mapper 两部分创建完成。
接下来配置垂直分库的策略,因为要做到专库分
(2)配置垂直分库策略
在 application.properties 进行配置。
为了配置更明显,复制 application.properties,命名为application.properties02,修改为专库专表。
保留内部数据,接下来新加内容。
因为要操作是新数据库,所以首先添加 m0数据源。
复制数据库的配置。
修改为配置第三个数据源,m2 修改为 mo ,地址修改为user_db。
#配置第三个数据源具体内容,包含连接池,驱动,地址,用户名和密码spring.shardingsphere.datasource.m0.typecom.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.mO.driver-class-name-com. mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysq1://localhost:3306/user_db?serverTimezone-GMT%2B8
spring.shardingsphere.datasource.m0.username-root
spring.shardingsphere.datasource.m0.password-root
数据库的数据源配置完成。
然后配置策略内容。策略可以直接修改,因为现在要做专库专表。
首先看表的规则,把 course 改成 t_user。然后设置表和库的分布情况。因为现在是专库专表,里边数据源是 m0,后面加上固定 t_user 数据库
#配置 user_db 数据库里面 t_user 专库专表
spring. shardingsphere. sharding. tables. t_user. actual-data-nodes=m$-> {0}. t_user
#指定course表里面主键cid 生成策略SNOWFLAKE
spring.shardingsphere.sharding.tables.t_user.key-generator. column=user_id spring.shardingsphere. sharding. tables. t_user. key-generator. type=SNOWFLAKE
#指定表分片策略约定cid值偶数添加到course_1表,如果cid是奇数添加到course_2表
spring. shardingsphere. sharding. tables. t_user. table-strategy. inline. sharding-column-user_id
spring.shardingsphere. sharding. tables. tuser. table-strategy. inline. algorithm-expression=t_user
m0 库里 t_user 表固定。然后第二部分是主键,数据库 user_db,策略是SNOWFLAKE,规则修改为 user _id。
因为现在只是垂直分库,并没有做到水平,所以表达式中可以直接写表名,当操作t_user表或者user数据,就找m0里 t_user 表做操作。
它的规则是简单规则,真正做到专库分表,关键在于里边配置。
当操作User,就到m0里的t_user表中操作。
最后写测试代码来完成。
(3)编写测试代码
加数据或者查数据都会找User定位的表,m0中的t_user表。根据该数据源和表型操作。因为编写了里边的垂直分库专库专表。
在测试类中,首先注入。
//注入 user 的 mapper
@Autowired
private UserMapper userMapper;
//=====测试垂直分库=====
垂直分库两个操作,添加和查询,可以复制之前的,然后修改 course 为 user,去掉course 的操作。
//添加操作
@Test
public void addUserDb {
User user=new User();
user. setUsername("lucy");
user. setUstatus(
“a” ) ;
userMapper.insert(user) ;
注意现在操作 user,所以 userMapper 是一类表,不要用 courseMapper ,这样添加操作完成。
//查询操作
@Test
public void findUserDb() {QueryWrapper<User> wrapper=new QueryWrapper<>();
//设置userid值
wrapper.eq(column:"user_id",val:100L);
User user=userMapper.selectOne(wrapper):
System.out.println(user);
根据 user id 得到内容,这是两个基本方法。
最后测试效果。
如果测试正确,在进行添加时,就会做到专库专表,找到 m0数据源中 t_user 表,查询用户信息时也是相同操作。
三、检验
1.结果
所以先做添加来查看效果。
执行后报错,missing 缺少 data sourcename。data source 名字为空,是数据源或者操作数据库中有问题,检查问题源。
首先配置一般没有错。但是问题在于之前操作course时,数据表叫course1和course2。。但是现在user表名是t_user,现在是user实体类不知道对应的是哪张表,因为规则不一样。需要指定user类对应的哪张表,不指定会根据命名找表。
指定加注解
@TableName
(value=”t_user”)
//指定对应表
加上注解后,再执行看结果。
发现数据lucy和a添加成功底层找M0中的t_user表,向里面添加数据,做到了专库专表。
添加后再来看查询。复制user_id并执行方法,发现数据查的是m0数据源中的t_user表,做到了专库分表,垂直分库效果。
2.小结
所以特别注意刚才遇到的问题:
@Data
@TableName (value = "t user
”)//指定对应表
public class User {
private Long userId;
private String username ;
private String ustatus;
在写实体类的时候,注意可以指定类是哪张表。如果不指定,会使用表名匹配,名字和规则有问题需要指定表。
然后另外两个最基本代码,添加和是查询。在过程中需要把 user mapper 注入
也就是用 Sharding-JDBC 实现了水平拆分和垂直拆分,所以相关代码要熟练。比较核心的是在配置文件中做配置,分库分表、各种策略配置以及专户专表已经演示出来了,所以 Sharding-JDBC、分库分表基本操作已经完成,可以按照演示过程整合出来。