概述:垂直分库即转库专用,不同的数据库中存放不同的表信息。比如学生和课程信息,我们将课程表存放与一个数据库中,学生信息存储于另一个库中,本章将介绍如何通过配置Sharding jdbc实现垂直分库操作。

环境:SpringBoot 2.2 + mybatis plus3.0 + Sharding jdbc4.0

需求:我们将用户表t_user 表存放在数据库user_db中。course表保持上一章节《ShardingSphere(三) 水平分库配置搭建,实现写入读取》中的水平分库水平分表配置。我们在保存读取用户信息时在user_db库中操作,读写course表时在course_db_1、course_db_2表中操作。

工程目录结构:

主要步骤:

  1. 数据库环境准备
  2. 创建maven工程引入依赖
  3. 创建主启动类
  4. 创建业务代码
  5. 创建SpringBoot配置文件
  6. 编写测试类测试验证

一、数据库环境准备

分表创建三个数据库 user_db、course_db_1、course_db_2。user_db库中创建t_user表,course_db12中分别创建course_1、course_2表

#课程表 course_1 course_2 结构一致
CREATE TABLE `course_1` (`cid` bigint(20) NOT NULL,`cname` varchar(50) NOT NULL,`user_id` bigint(20) NOT NULL,`cstatus` varchar(10) NOT NULL,PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
#用户表
CREATE TABLE `t_user` (`user_id` bigint(20) NOT NULL,`username` varchar(50) NOT NULL,`ustatus` varchar(50) NOT NULL,PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

二、创建maven工程

pom.xml 引入相关依赖,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.sharding</groupId><artifactId>sharding</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.20</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.31</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

三、创建主启动类

src/main/java/com/xiaohui/ShardingApplication.java

package com.xiaohui;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.xiaohui.mapper")
public class ShardingApplication {public static void main(String[] args) {SpringApplication.run(ShardingApplication.class,args);}
}

四、创建业务代码

编写数据库实体类以及表Dao层接口类,注意mybatis-plus 中接口层需要继承BaseMapper接口

src/main/java/com/xiaohui/entity/Course.java

package com.xiaohui.entity;import lombok.Data;@Data
public class Course {private Long cid;private String cname;private Long userId;private String cstatus;
}

由于user实体类与表名不匹配,所以需要使用mybatis-plus @TableName注解进行声明

package com.xiaohui.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName(value="t_user")
public class User {private Long userId;private String username;private String ustatus;
}

src/main/java/com/xiaohui/mapper/CourseMapper.java

package com.xiaohui.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaohui.entity.Course;
import org.springframework.stereotype.Repository;@Repository
public interface CourseMapper extends BaseMapper<Course> {
}

src/main/java/com/xiaohui/mapper/UserMapper.java

package com.xiaohui.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaohui.entity.User;
import org.springframework.stereotype.Repository;@Repository
public interface UserMapper extends BaseMapper<User> {
}

五、创建SpringBoot 配置文件(重点)

创建SpringBoot配置文件 application.properties

#sharding-jdbc 分片策略
#=================================数据源配置部分========================================
#数据源名称,多数据源以逗号分隔
spring.shardingsphere.datasource.names=ds0,ds1,ds2
#配置 ds0 ds1数据源具体内容
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://127.0.0.1:3306/course_db_1
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/course_db_2
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/user_db
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root#=================================数据节点配置部分======================================
#配置course表在数据库上的信息,在那些数据库里,以及库中的分表情况(tables 后面的course可以随便取名代表后面的匹配表)
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds$->{0..1}.course_$->{1..2}
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds$->{2}.t_user#=================================数据库分库策略=======================================
# 配置默认的水平分库的策略 使用 user_id字段进行判断
#spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
#spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
#数据库策略
spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.algorithm-expression=ds2
# 配置course表的分库策略
spring.shardingsphere.sharding.tables.course.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}#=================================数据库分表策略========================================
#指定分片策略 约定cid值偶数添加到couse_1表,奇数添加到course_2表上
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}
#表策略table-strategy
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user#==================================数据库字段生成策略====================================
###单表的水平拆分配置 指定course表里面主键cid的生成策略 SNOWFKAKE 雪花算法
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
#字段生成策略key-generator
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE#==================================其他配置=============================================
#解决报错 Consider renaming one of the beans or enabling overriding...
spring.main.allow-bean-definition-overriding=true
#打开sql日志输出
spring.shardingsphere.props.sql.show=true

在垂直分库配置中主要声明部分在 数据节点配置中需要指定对应表所在的库。以及分库策略中配置对应的分库策略,以来实现专库专用。

spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds$->{0..1}.course_$->{1..2}
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds$->{2}.t_user
spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.algorithm-expression=ds2
spring.shardingsphere.sharding.tables.course.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}

我们t_user表只有一个库所以我们在配置inline的分库表达式就直接写死为ds2库。

六、编写测试类测试验证

编写测试类:src/test/java/com/xiaohui/MainTest.java

package com.xiaohui;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaohui.entity.Course;
import com.xiaohui.entity.User;
import com.xiaohui.mapper.CourseMapper;
import com.xiaohui.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class MainTest {@Autowiredprivate CourseMapper courseMapper;@Autowiredprivate UserMapper userMapper;@Testpublic void testUserAdd(){User u = new User();u.setUsername("王五");u.setUstatus("1");userMapper.insert(u);}@Testpublic void testUserGet(){QueryWrapper wrapper = new QueryWrapper<User>();wrapper.eq("user_id", 563316786842304513L);User user = userMapper.selectOne(wrapper);System.out.println(user);}@Testpublic void testCourseGet(){QueryWrapper<Course> wrapper = new QueryWrapper<>();wrapper.eq("cid",563102169142657024L);wrapper.eq("user_id",102L);Course course = courseMapper.selectOne(wrapper);System.out.println(course);}@Testpublic void testCourseDel(){QueryWrapper<Course> wrapper = new QueryWrapper<>();wrapper.eq("cid",557605627916976129L);wrapper.eq("user_id",101L);courseMapper.delete(wrapper);}
}
  • 执行新增测试方法testUserAdd(),控制台打印如下:
2021-02-02 10:59:47.944  INFO 8960 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO t_user  ( username,ustatus )  VALUES  ( ?,? )
2021-02-02 10:59:47.945  INFO 8960 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds2 ::: INSERT INTO t_user   (username, ustatus, user_id) VALUES (?, ?, ?) ::: [王五, 1, 563316786842304513]

通过sql 和数据库查看我们只在ds2即 user_db库中新增了一条数据。

执行查询用户测试方法testUserGet(),日志打印如下:

2021-02-02 11:08:57.926  INFO 8780 --- [           main] ShardingSphere-SQL                       : Logic SQL: SELECT  user_id,username,ustatus  FROM t_user  WHERE  user_id = ?
2021-02-02 11:08:57.927  INFO 8780 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds2 ::: SELECT  user_id,username,ustatus  FROM t_user  WHERE  user_id = ? ::: [563316786842304513]
User(userId=563316786842304513, username=王五, ustatus=1)
  • 执行课程查询方法,日志打印如下:
2021-02-02 11:12:56.141  INFO 7824 --- [           main] ShardingSphere-SQL                       : Rule Type: sharding
2021-02-02 11:12:56.143  INFO 7824 --- [           main] ShardingSphere-SQL                       : Logic SQL: SELECT  cid,cname,user_id,cstatus  FROM course  WHERE  cid = ? AND user_id = ?
2021-02-02 11:12:56.144  INFO 7824 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds0 ::: SELECT  cid,cname,user_id,cstatus  FROM course_1  WHERE  cid = ? AND user_id = ? ::: [563102169142657024, 102]
Course(cid=563102169142657024, cname=sql_2, userId=102, cstatus=1)

根据上面打印,均按照Sharding对应的配置规则进行正确的分库分表路由。成功的进行了新增以及查询操作。

ShardingSphere(四) 垂直分库配置搭建,实现写入读取相关推荐

  1. ShardingSphere(三) 水平分库配置搭建,实现写入读取

    概述:本章将介绍如何通过Sharding jdbc来实现数据库的水平分库操作,并从零搭建一个SpringBoot工程实现分库的读写操作.本文章在上一章节基础上改造,其中内容包含了表的水平拆分内容 环境 ...

  2. ShardingSphere(五) 公共表配置,实现读写改操作

    概述:如果我们有一些非业务表如基础配置表或者数据字典等表,不需要做分库分表那么改如何设计,Sharding-jdbc 中公共表可实现该种配置.公共表即每个数据库中都存在的一张表,改表在数据库中也无分表 ...

  3. ShardingSphere(二) 水平分表配置搭建,实现分表写入读取

    概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...

  4. 4、ShardingSphere 之 Sharding-JDBC 实现垂直分库

    1 实现垂直分库,专库专表 实现目标,用户查询用户信息的时候,只操作user_db中t_user表 2 创建数据库 CREATE SCHEMA `userdb` DEFAULT CHARACTER S ...

  5. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇 http://www.cnblogs.com/lyhabc/p/4678330.html 第二篇 http:// ...

  6. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

  7. Sharding-Sphere,Sharding-JDBC_分库分表(垂直分库_垂直分表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记003

    首先我们看看分库分表有几种方式: 然后我们看, 有垂直分库,垂直分表 有水平分库,水平分表. 之前我们做mycat的时候,说过有垂直分库,水平分表, 垂直分表的情况好像是没有说. 要说垂直分表,我们先 ...

  8. 腾讯云轻量级应用服务器的配置搭建及网站

    新手笔记腾讯云轻量级应用服务器的搭建 目录 新手笔记腾讯云轻量级应用服务器的搭建 一 准备工作 二 详细步骤 1.购买域名 2. 网站备案 3.域名解析 4.证书安装 Tomcat安装配置 总结: 一 ...

  9. web服务器常见配置搭建详解(超详细)

    前言: 本博客借鉴一些写的比较好的博客,进行归纳总结,整理了一篇比较详细的服务器常见配置搭建教程 一来是和大家一起分享,二来也是作为自己的学习笔记记录一下. 温馨提示: 篇幅较长,请分阶段选择性查看. ...

最新文章

  1. java书籍_这本最适合夯实基础的Java 书籍,80% 的 Java 程序员没认真看过
  2. Linux中mount Windows中的共享文件夹
  3. Graph cut [转]
  4. SpringSecurity集中式整合之授权操作
  5. E104-BT02蓝牙无线传输模块物联网芯片的智能控制、采集
  6. FreeBSD9.1安装Gnome2桌面
  7. Visual Studio 2003/Visual Studio 2005常用快捷键(快捷方式)
  8. 求你了,别再随便打日志了,教你动态修改日志级别!
  9. xvidcore交叉编译
  10. 计算机每次启动时系统时间不更新,电脑每次开机都要重新设置时间
  11. [python爬虫]爬取英雄联盟所有英雄数据并下载所有英雄皮肤
  12. 基于IP搭建SAN存储
  13. 可变形卷积系列(三) Deformable Kernels,创意满满的可变形卷积核 | ICLR 2020
  14. 百度图神经网络7日打卡营--DAY01前半部分 总结
  15. 10大渗透神器,渗透测试必备
  16. 「hdu6608」Fansblog 威尔逊定理
  17. bzoj 3036: 绿豆蛙的归宿
  18. stm32 多通道AD和单通道AD的差别
  19. 谷歌离线地图API解析
  20. Win10永久修改命令提示符cmd的默认当前页码页为936(简体中文 GBK)

热门文章

  1. JDBC连接SQL Server 2005问题
  2. 安卓开发第一个小程序HelloWorld
  3. java项目eclipse上tomcat部署后项目添加不进去
  4. SpringBoot集成Cache缓存(Redis缓存,RedisTemplate方式)
  5. Django Bootstrap开发笔记03 - Bootstrap环境配置
  6. touch拦截监听_Android - requestDisallowInterceptTouchEvent() 阻止父层的View截获touch事件(事件处理机制)...
  7. 小学python还是c_python和c先学哪个
  8. Linux lvs 的固定访问
  9. maven中ssm框架快速搭建
  10. 浅谈HTTP中Get与Post的区别_转