server sql 水平分表_springboot集成Shardingsphere进行分库分表

当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习一下,下面文章就记录一下如何用ShardingSphere来进行分库分表!(能力有限,本章不会讲原理奥,只是记录如何分库分表,原理方面后面我学习了再写,现在先会用先0.0,)

1、官网文档地址

这是ShardingSphere官网文档的地址,有需要的可以点进去看一下。

2、技术及环境

数据库项目用到的技术
mysql5.6springboot、mybatis、shardingsphere

3、建库建表

1、新建两个数据库:一个user0,一个user1。e373cc1b831c5e96fbd39bb916febc31.png2、在user0数据库新建两个表:一个us_admin0,一个us_admin1,新建语句如下:

CREATE TABLE `us_admin0` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` int(11) NOT NULL COMMENT '用户id',
 `addr_id` int(11) NOT NULL COMMENT '地址id',
  `user_name` varchar(64) NOT NULL COMMENT '用户编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';


CREATE TABLE `us_admin1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` int(11) NOT NULL COMMENT '用户id',
 `addr_id` int(11) NOT NULL COMMENT '地址id',
  `user_name` varchar(64) NOT NULL COMMENT '用户编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

3、在user1数据库新建两个表:一个us_admin0,一个us_admin1,新建语句如下:

CREATE TABLE `us_admin0` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` int(11) NOT NULL COMMENT '用户id',
 `addr_id` int(11) NOT NULL COMMENT '地址id',
  `user_name` varchar(64) NOT NULL COMMENT '用户编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';


CREATE TABLE `us_admin1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` int(11) NOT NULL COMMENT '用户id',
 `addr_id` int(11) NOT NULL COMMENT '地址id',
  `user_name` varchar(64) NOT NULL COMMENT '用户编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

4、搭建springboot项目

这部分就idea自己创建一下就好了,pom文件及配置文件内容如下:

pom文件:

<?xml  version="1.0" encoding="UTF-8"?>
"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 https://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.springframework.bootspring-boot-starter-parent2.0.7.RELEASE com.shardingsphere1.0.0-SNAPSHOTsphereDemo project for Spring Boot1.8Hoxton.SR33.8.28.0.12junitjunit4.12testorg.springframework.bootspring-boot-starter-web-servicesorg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engineorg.apache.shardingspheresharding-jdbc-spring-boot-starter4.0.0-RC1com.alibabadruid-spring-boot-starter1.1.14mysqlmysql-connector-javaorg.springframework.bootspring-boot-starter-actuatororg.mybatis.spring.bootmybatis-spring-boot-starter2.1.2org.springframework.bootspring-boot-maven-plugin

application.yml配置:

# 服务端口
server:
  port: 8888

# 服务名
spring:
  application:
    name: test-user
  # 配置sharding jdbc分片规则
  shardingsphere:
    datasource:
      # 连接名称(下面要用这个名称来区分库)
      names: ds0,ds1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.1.19:3306/user0?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123
        initialSize: 5      #初始化大小
        maxActive: 200       #最大值
        maxWait: 2000      #最大等待时间,配置获取连接等待超时,时间单位都是毫秒ms
        timeBetweenEvictionRunsMillis: 60000    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.1.19:3306/user1?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123
        initialSize: 5      #初始化大小
        maxActive: 200       #最大值
        maxWait: 2000      #最大等待时间,配置获取连接等待超时,时间单位都是毫秒ms
        timeBetweenEvictionRunsMillis: 60000    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接
    # 配置分片规则
    sharding:
      # 按表来区分
      tables:
        us_admin:
          # 配置数据节点
          actualDataNodes: ds${0..1}.us_admin${0..1}
          # 分库策略
          databaseStrategy:
            inline:
              # 分库的规则 用user_id这个字段来分库 总共有两个库 及ds0(user0)与ds1(user1)
              shardingColumn: user_id
              algorithmExpression: ds${user_id % 2}
          # 分表策略
          tableStrategy:
            inline:
              shardingColumn: addr_id
              algorithmExpression: us_admin${addr_id % 2}
          keyGenerator:
            column: id
            type: SNOWFLAKE
      bindingTables:
        us_admin
      broadcastTables:
        t_config
      defaultDataSourceName: ds0

    props:
      sql.show: true

# 配置xml 的扫描路径
mybatis:
  mapper-locations: classpath:mapper/*.xml
  check-config-location: true
  type-aliases-package: com.sharding.sphere.model
  configuration:
    cacheEnabled: true
    mapUnderscoreToCamelCase: true

5、接口测试

编写增删改接口进行测试,分库根据user_id来切片,分表根据addr_id来切片,分别插入一些数据,结果如下:

@RestController
public class UserController {

    @Resource
    UserService userService;

    @RequestMapping("add")
    public Integer add(@RequestBody UsAdmin usAdmin){
        Integer add = userService.add(usAdmin);
        return add;
    }

    @RequestMapping("select")
    public List select(){
        List select = userService.select();return select;
    }@RequestMapping("delect")public Integer delect(Long id){
        Integer delect = userService.delect(id);return delect;
    }
}

查询sql语句:

<select id="selectAll" resultMap="BaseResultMap">
    select
      id, addr_id, user_id, user_name
    from us_admin
  select>

新增sql语句:

<insert id="insertSelective" parameterType="com.sharding.sphere.model.UsAdmin">
    insert into us_admin
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      if>
      <if test="userId != null">
        user_id,
      if>
      <if test="addrId != null">
        addr_id,
      if>
      <if test="userName != null">
        user_name,
      if>
    trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      if>
      <if test="userId != null">
        #{userId,jdbcType=INTEGER},
      if>
      <if test="addrId != null">
        #{addrId,jdbcType=INTEGER},
      if>
      <if test="userName != null">
        #{userName,jdbcType=VARCHAR},
      if>
    trim>
  insert>

删除sql语句:

 delete from us_admin
    where id = #{id,jdbcType=BIGINT}

数据新增分表分库结果:

9e3d393fd95263a08f600bf4117b4a0e.png
image

查询结果:

8452d9ec01caf3f119765512a34df314.png
image

可以看到,新增数据的时候以user_id%2来计算分库,双数在user0库,单数在user1库,addr_id作为分表id,双数在us_admin0表,单数在us_admin1表,先确定库然后确定表,而查询一条语句可以查询到所有,不过ShardingSphere好像有些sql语句是不支持的,比如关联自己这种操作(us_admin left join us_admin这种),还有一些不支持的sql,具体的可以百度看看。

讲道理来看,ShardingSphere其实对代码的侵入量并不算多,只是有一些配置,配置好之后该写的sql跟原来一样的,可能是还没有踩到该踩的坑吧,等周末研究一下原理之后再写一篇文章分析分析。

6、公众号

如果你觉得我的文章对你有帮助话,欢迎关注我的微信公众号:"一个快乐又痛苦的程序员"(无广告,单纯分享原创文章、已pj的实用工具、各种Java学习资源,期待与你共同进步)a83c06fb01904ef2f821bfece629fca2.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网鼎杯2020php反序列化,2020-网鼎杯(青龙组)_Web题目 AreUserialz Writeup

0x02 AreUSerialz关于s大写小写问题&#xff0c;可以看p神在圈子里发的&#xff0c;我在最后付上截图考点: php反序列化 php特性 利用链构造1.打开页面得到代码如下:include("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $file…

物理实验数据处理(c语言)

看程序应该能看懂怎么输入&#xff0c;我就不写具体输入什么了 1.转动惯量的测定 1.不同物体的摆动周期 #include<iostream> #include<cmath> using namespace std;int main(){double pi3.14,jzhi0.187e-4,jjia0.321e-4;double t0,t1,t2,t3,t4,t5;double k,j1,j…

统计csv词频_分词词频统计

网上随便找段文字&#xff0c;就以Power BI官网上这段文字为例好了&#xff1a;想要统计其中的词频&#xff0c;实现如下图的效果&#xff1a;解法1&#xff1a;使用输入法词库其中的难点无疑在分词了&#xff0c;中文不像英文可以按空格拆开分词&#xff0c;仅仅单靠Power Que…

linux 开启关闭tomcat服务器端口,linux系统安装、启动和关闭tomcat

Tomcat 可充当一个完全独立的 web 服务器。Tomcat 最大优势在于 servlet 和 JSP 引擎。安装 tomcat:Sudo yum install -y tomcat-*启动 tomcat:[userlocalhost ~]$ /etc/rc.d/init.d/tomcat start[userlocalhost ~]$[userlocalhost ~]$ /etc/rc.d/init.d/tomcat status[userloc…

利用matlab绘制图形

目前存在的一些问题&#xff1a; 1.第一题的两个图像无法重叠 2.最后一个题的第一个图是六瓣&#xff0c;而我写的是八瓣 感谢张同学给我指出来&#xff0c;目前我正在思考解决方法 第一个的话我以为把框缩小就可以重叠了&#xff0c;但是今天试了一下还是分开的&#xff0c;还…

haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了

上篇文章介绍了Netty内存模型原理&#xff0c;由于Netty在使用不当会导致堆外内存泄漏&#xff0c;网上关于这方面的资料比较少&#xff0c;所以写下这篇文章&#xff0c;专门介绍排查Netty堆外内存相关的知识点&#xff0c;诊断工具&#xff0c;以及排查思路提供参考现象堆外内…

linux 硬盘大小 命令,linux 查看磁盘空间大小的命令和方法

这篇文章主要为大家详细介绍了linux 查看磁盘空间大小的命令和方法&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。1.Ubuntu 查看磁盘空间大小命令df -h Df命令是linux系统以磁盘分区为单位查看文件系统&#xff…

matlab GUI 设计 自学笔记

图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;&#xff1a; 用户与计算机进行信息交流的窗口。 设计图形用户界面的方法 调用建立用户界面控件的函数 使用MATLAB提供的GUIDE工具进行可视化设计 控件对象及其操作 &#xff08;1&#xff09…

grub shell 错误_各种情况GRUB损坏进不了系统的解决方案

1.在磁盘分区表变动之后&#xff0c;比如删除了grub.cfg所在分区的前一个分区&#xff0c;导致分区号前移一位时&#xff0c;开机显示 grub rescue> 。处理方法&#xff1a;(假设原来grub.cfg在/dev/sda4&#xff0c;而现在变成了/dev/sda3)ls(查看分区)ls (hd0,7)/boot/(查…

linux 系统盘无法ls,linux – ls:阅读目录.:输入/输出错误

当我尝试在已安装的硬盘上使用“ls”时,我的系统引发了I / O错误.我在用hadoophbase1:/hddata$uname -aLinux hbase1 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 16:19:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linuxhadoophbase1:/hddata$dfFilesystem 1K-blocks Use…

matlab guide对话框+滑动条+弹出式菜单+列表框的使用

文章目录前言matlab数据传递概观对话框创建利用滑动条实现颜色调控利用弹出式菜单选择并输入文本框利用列表框选择并输入文本框前言 我觉得gui无非就是给程序加了件衣服&#xff0c;其实具体的程序我们都会写&#xff0c;我们唯一不明白的是那几个部分数据之间的传递&#xff…

流放之路材质过滤怎么设置_松下除湿机怎么样 松下除湿机款式有哪些型号【详解】...

马上南方就要进入梅雨季节了&#xff0c;潮湿的天气容易滋生细菌&#xff0c;可能会导致人们出现过敏现象&#xff0c;所以很多家庭都选择购买除湿机&#xff0c;现在市场上的除湿机不是很多&#xff0c;其中松下的除湿机比较受欢迎&#xff0c;所以小编我就来跟大家说一说松下…

matlab图形句柄+图形对象+图形对象的属性+对象操作

文章目录前言&#xff1a;图形对象&#xff1a;图形句柄&#xff1a;图形对象的属性&#xff1a;对象的基本操作figure对象(图形窗口)figure()函数&#xff1a;clf()函数清空当前图形窗口&#xff1a;axes坐标轴对象image()line()text()前言&#xff1a; 下面这些是为了更好地…

linux用户开放crontab权限,linux – / etc / crontab权限

/ etc / crontab文件具有以下权限&#xff1a;-rw-R – R–我知道这个文件是用于系统cron作业的,其他用户不应该有权修改它.当前权限允许所有用户读取对文件的访问权限,使他们能够查看内容.是否有必要让所有用户都能读取/ etc / crontab&#xff1f;我相信所有用户都不应该知道…

echart 高度 不用 不撑满_注意厨房台面高度及细节 装出省心舒服 装出事半功倍...

厨房的装修设计最好还是细节做得好&#xff0c;细节做得能达到事半功倍的效果&#xff0c;厨房台面高度如何设计才是最合适呢&#xff1f;我们一起走进包头装修网了解一下吧&#xff01;下面三个台面的设计细节&#xff0c;也许就能让你家的厨房突然变得好用起来——哪怕你可能…

利用matlab guide制作简易计算器

前言&#xff1a; 当然了这个太简单了&#xff0c;新手可以借鉴一下&#xff0c;举一反三的话还可以添加一些功能或者简洁一些。比如下拉框啊之类的 而且呢&#xff0c;这个你弄明白了&#xff0c;所有运算有关的&#xff0c;输入输出有关的&#xff0c;都大致相同。 实现过程…

linux复制目录命令夹,linux复制目录(文件夹)和打包命令

linux复制目录(文件夹)和打包命令复制目录命令&#xff1a; cp 需要复制的目录 -r 目的目录 (注意带参数-r)压缩文件&#xff1a;zip -r 压缩后文件名 需要压缩的目录喎?http://www.Bkjia.com/kf/ware/vc/" target"_blank" class"keylink">vcD4KP…

c#怎么拟合函数得到参数_吴恩达老师课程笔记系列第32节 -正则化之代价函数(2)...

第32节 -正则化之代价函数(2)参考视频: 7 - 2 - Cost Function (10 min).mkv 上面的回归问题中如果我们的模型是&#xff1a;我们可以从之前的事例中看出&#xff0c;正是那些高次项导致了过拟合的产生&#xff0c;所以如果我们能让这些高次项的系数接近于 0 的话&#xff0c;我…

Matlab guide菜单+快捷菜单的使用

菜单选择&#xff1a; Opening函数&#xff1a; openingFcn执行于窗口可见之前&#xff0c;这个时候你想做什么的话可以把代码写进去 function plott_OpeningFcn(hObject, eventdata, handles, varargin) t1/200:1/200:1; plot(t,sin(2*pi*t*10),r);几个回调函数&#xff1a; …

linux include 编译,linux-如何使用OpenSSL include编译.c文件?

linux-如何使用OpenSSL include编译.c文件&#xff1f;我正在尝试编译一个包含以下内容的小.c文件&#xff1a;#include #include #include #include 在我拥有.c文件的同一文件夹中&#xff0c;我拥有带有所有这些文件(以及更多文件)的/ openssl&#xff0c;也在突触包管理器中…