server sql 水平分表_springboot集成Shardingsphere进行分库分表
当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习一下,下面文章就记录一下如何用ShardingSphere来进行分库分表!(能力有限,本章不会讲原理奥,只是记录如何分库分表,原理方面后面我学习了再写,现在先会用先0.0,
)
1、官网文档地址
这是ShardingSphere官网文档的地址,有需要的可以点进去看一下。
2、技术及环境
数据库 | 项目用到的技术 |
---|---|
mysql5.6 | springboot、mybatis、shardingsphere |
3、建库建表
1、新建两个数据库:
一个user0,一个user1。2、在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来切片,分别插入一些数据,结果如下:
@RestControllerpublic 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}
数据新增分表分库结果:
查询结果:
可以看到,新增数据的时候以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学习资源,期待与你共同进步)
server sql 水平分表_springboot集成Shardingsphere进行分库分表相关推荐
- Shardingsphere的分库分表+读写分离+分页条件查询
Shardingsphere的分库分表与读写分离 导入依赖 <dependencies><dependency><groupId>org.springframewo ...
- mysql 横向分表合并_MySQL横向扩展-分库分表解决方案总结
从业务场景看分库分表 互联网行业中,业务场景通常写少读多的情况居多,在MySQL的使用前期,读性能大多可以通过SQL优化来解决,但随着业务的持续发展,单纯依靠SQL的查询优化会越来越难以达到业务服务要 ...
- mysql分表后怎么索引_分库分表后的索引问题
摘要 最近遇到一个慢sql,在排查过程中发现和分库分表后的索引设置有关系,总结了下问题. 问题 在进行应用健康度盘点时,发现有个慢sql 如下 select brandgoodid from bran ...
- MySQL分库分表会带来哪些问题?分库分表问题
MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO.硬件资源.连接数的瓶颈,同时也带来了一些问题.下面将描述这些技术挑战以及对应的解决思路. 分库分表 ...
- ShardingSphere(八) 分库分表的多种分片策略
在之前文章<ShardingSphere(二) 水平分表配置搭建,实现分表写入读取>中,我们介绍了数据库的水平分表配置,在文章中只介绍了最简单的行表达式分表配置方式,但往往在实际中我们的业 ...
- ShardingSphere JDBC 分库分表 读写分离 数据加密
简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...
- MySQL单表膨胀优化之MyCat分库分表
MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...
- python mysql分库分表_干货 : 常用MySQL分库分表方案
Python乱炖推荐搜索后浪 动森玩家 送书 数据分析 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Serv ...
- 数据库表设计的随笔(分库分表)
笔者目前就职的是一家创业型的互联网公司,既然算是互联网公司,那么就会设计到无论是应用系统还是数据库的分布式.下面简单介绍下有关数据库方面的一些设计. 数据库表的设计,根据自己的业务所需可以拆分成多库. ...
最新文章
- php小程序登录code无效,微信小程序出现“invalid code”怎么办
- c++ 获取文件的hashcode_jsp 实现文件上传和下载
- 什么是raid 容错式磁盘阵列?
- java多线程优先级的方法_Java多线程以及线程优先级
- python语言保留字的特点_python保留字及其说明
- 小熊的日记图文列表布局小程序模板
- 60-400-045-使用-binlog-Maxwell读取MySQL binlog日志到Kafka
- linux 退出java,linux kill命令下如何优雅的退出java程序
- Qt学习之路(51): QByteArray和QVariant
- 格式要求_课题论文的格式要求
- ”0元中标的商业逻辑“ -- 如何更好防范项目风险(北京软件造价评估技术创新联盟:李培圣)...
- Java经典算法50道题
- 使用python实现可视化ftp客户端(本地文件展示和搜索功能、ftp文件展示和搜索功能以及上传和下载功能)
- NanoPC-T4 RK3399和PC局域网络传输摄像头视频python
- gmp 5.0.1 windows 下编译使用
- 画法几何及工程制图考试卷A卷
- 宏定义超过字长的一些问题
- 中美跨境电商贸易投资云洽会成功举办;TT Shop和TTforBusiness将互通;PhonePe月破20亿...|洞悉跨境
- 官方微信支付跟特约商户的区别
- C#调用Excel版本不兼容的解决方法
热门文章
- 使用ACME部署生成阿里云免费HTTPS证书
- 免费的定时任务托管 clock.sh
- 介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法
- java heap buffer direct buffer_java NIO - DirectBuffer 和 HeapBuffer
- 1命名规则 sentinel_Alibaba Sentinel 规则参数总结
- myftpadmin+proftpd+mysql架设ftp服务器_linux下用Proftpd搭建ftp服务器及配置方法
- 九年级数学解方程50道_【初中数学】北师大版九年级上册数学知识点总结
- vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
- yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort
- 电脑端腾讯视频如何设置离线下载完成后自动关机