SpringBoot整合Sharding-JDBC实现水平分表
目录
- 数据库的水平分表
- 需求说明
- 数据库表创建
- 编写程序
- 引入 `maven` 依赖
- 实体类
- `dao` 层
- `Mapper` 接口
- `Mapper.xml`
- `Service` 层
- `Controller` 层
- `application.properties` 文件
- 接口测试
- 数据插入测试
- 主键 `order_id` 为奇数
- 主键 `order_id` 为偶数
- 数据查询测试
数据库的水平分表
关于水平分表可以参考文章:https://blog.csdn.net/weixin_38192427/article/details/122441366
需求说明
创建两张表 t_order_1
和 t_order_2
,这两张表是订单表水平拆分后的表,通过 Sharding-JDBC
向订单表插入数据, 按照一定的分片规则,主键为偶数的进入 t_order_1
,主键为奇数进入 t_order_2
,通过 Sharding-JDBC
查询数据,根据 SQL
语句的内容从 t_order_1
或 t_order_2
查询数据
数据库表创建
创建订单库 order_db
,然后在 order_db
中创建 t_order_1、t_order_2
表,可以看到两张表的列是完全相同的,这就是水平分表
CREATE TABLE `t_order_1` (`order_id` int(11) NOT NULL COMMENT '订单id',`price` decimal(10,2) NOT NULL COMMENT '订单价格',`user_id` int(11) NOT NULL COMMENT '下单用户id',`status` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '订单状态',PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;CREATE TABLE `t_order_2` (`order_id` int(11) NOT NULL COMMENT '订单id',`price` decimal(10,2) NOT NULL COMMENT '订单价格',`user_id` int(11) NOT NULL COMMENT '下单用户id',`status` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '订单状态',PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
编写程序
引入 maven
依赖
主要依赖如下,其它依赖自行引入
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version>
</dependency>
实体类
@Data
public class Order implements Serializable {@NotNull(message = "参数orderId不能为空")private Integer orderId;@NotNull(message = "参数price不能为空")private BigDecimal price;@NotNull(message = "参数userId不能为空")private Integer userId;@NotBlank(message = "参数status不能为空")private String status;
}
dao
层
Mapper
接口
@Mapper
public interface OrderMapper {int insertOrder(Order order);List<Order> findOrderByIds(List<Integer> orderIds);
}
Mapper.xml
<insert id="insertOrder" parameterType="org.example.pojo.Order">insert into t_order(order_id, price, user_id, status)values (#{orderId,jdbcType=INTEGER}, #{price,jdbcType=DECIMAL}, #{userId,jdbcType=INTEGER},#{status,jdbcType=VARCHAR})
</insert><select id="findOrderByIds" parameterType="java.util.List" resultType="org.example.pojo.Order">select<include refid="Base_Column_List"></include>from t_order AS twhere t.order_id in<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>
- 注意
SQL
语句的写法,抽象表名是t_order
,并不是具体的t_order_1
或t_order_2
Service
层
@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Overridepublic int insertOrder(Order order) {return orderMapper.insertOrder(order);}@Overridepublic List<Order> getOrderByIds(List<Integer> orderIds) {return orderMapper.findOrderByIds(orderIds);}
}
Controller
层
@Controller
@RequestMapping(path = "/order")
public class OrderController {@Autowiredprivate OrderService orderService;@PostMapping(path = "/addOrder")@ResponseBodypublic ResultMap addOrder(@Valid Order order, @NotNull BindingResult bindingResult) {// 参数校验if (bindingResult.hasErrors()) {String message = bindingResult.getFieldError().getDefaultMessage();return new ResultMap().fail().message(message);}int i = orderService.insertOrder(order);if (i > 0) {return new ResultMap().success().message("成功");}return new ResultMap().fail().message("失败");}@GetMapping(path = "/getOrder")@ResponseBodypublic ResultMap getOrder(@NotNull @RequestBody List<Integer> orderIds) {if (orderIds.isEmpty()) {return new ResultMap().fail().message("参数orderIds不能为空");}List<Order> orderList = orderService.getOrderByIds(orderIds);if (orderList.isEmpty()) {return new ResultMap().fail().message("没有查询到你想要的数据");}return new ResultMap().success().data(orderList).message("查询成功");}
}
application.properties
文件
server.port=8080# sharding-jdbc分片规则配置开始---------------------------------------------------------------
# 自定义数据源名称为 m1
spring.shardingsphere.datasource.names=m1
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://127.0.0.1:3306/order_db?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=123456
# 指定表的数据分布情况,其中t_order可以自定义,配置数据节点 m1.t_order_1 和 m1.t_order_2
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=m1.t_order_$->{1..2}
# 指定t_order表的主键是order_id,主键生成策略为SNOWFLAKE,SNOWFLAKE是一种分布式自增算法,保证id全局唯一
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
# 指定t_order表的分片策略,分片策略包括分片键和分片算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
# order_id为偶数的数据落在t_order_1,为奇数的落在t_order_2,分表策略的表达式为t_order_$->{order_id % 2 + 1}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2 + 1}
# 打开sql输出日志
spring.shardingsphere.props.sql.show=true
# sharding-jdbc分片规则配置结束---------------------------------------------------------------# 指定 mapper 文件路径
mybatis.mapper-locations=cldasspath:com/example/mapper/*.xml
mybatis.configuration.cache-enabled=true
# 开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
- 更多详细的配置文档说明:https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/configuration/config-spring-boot/
接口测试
数据插入测试
主键 order_id
为奇数
启动项目,使用 postman
测试接口 http://localhost:8080/order/addOrder
,结果如下
由于传入的参数 orderId
为 1
是奇数,数据应该落在 t_order_2
表中,如下
再来看看 t_order_1
表中的数据依然是空
主键 order_id
为偶数
使用 postman
再次测试接口 http://localhost:8080/order/addOrder
,结果如下
由于传入的参数 orderId
为 2
是偶数,数据应该落在 t_order_1
表中,如下
再来看看 t_order_2
表中的数据依然是上一次插入的数据
数据查询测试
启动项目,使用 postman
测试接口 http://localhost:8080/order/getOrder
,传入的参数 orderIds
为 [1,2]
的数组,进行批量查询,结果如下
在看看控制台 SQL
日志,如下
- 可以看看,
SQL
语句分别在t_order_1
和t_order_2
表中进行了查询
SpringBoot整合Sharding-JDBC实现水平分表相关推荐
- Sharding-JDBC水平分表详细教程
标签:postgresq shm utf8mb4 如何 template 表达式 otc tables code 介绍: Sharding-JDBC,定位为轻量级Jav ...
- 2、ShardingSphere 之 Sharding-JDBC实现水平分表
文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...
- ShardingSphere(二) 水平分表配置搭建,实现分表写入读取
概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...
- 水平分表、分库和垂直分表、分库和公共表的代码实现和讲解
文章目录 一.教学讲解视频 二.环境准备 三.水平分表 1.概念 2.代码 四.水平分库 1.概念 2.代码 五.垂直分表 1.概念 2.代码 六.垂直分库 1.概念 2.代码 七.公共表 1.概念 ...
- 使用sharding-jdbc实现水平分库+水平分表
前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,逻辑上为同一张表,分 ...
- 数据库--分库分表--垂直分表与水平分表
原文网址:数据库--分库分表--垂直分表与水平分表_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍数据库的分库分表的方案:垂直分表与水平分表. 关系型数据库本身比较容易成为系统瓶颈,单机存储容 ...
- Sharding-JDBC水平分表(分片策略)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记008
上一节我们实现了,水平分表的,环境的搭建,做了一个项目springboot的,然后创建了数据库,然后我们再去做 我们去配置sharding-jdbc的分片策略去. 我们可以去官网,点击了解更多 然后我 ...
- mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)
主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...
- MYSQL实现水平分表
mysql水平分表 本人主要以Navicat实现,具体想要高端点,可以用Sharing JDBC.Mycat去实现 水平分表 mysql水平分表 分库分表原理是什么? 为什么要分库分表? 二.水平分表 ...
- mysql使用MRG_MyISAM(MERGE)实现水平分表
来源:http://m.oschina.net/blog/382658 在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基 ...
最新文章
- Selenium3.X 与 Javascript (Nodejs)
- Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方
- Earth Mover's Distance (EMD)距离
- 利用Azure communication service实现跟Teams同样等级的沟通协作应用
- 单片机c语言出租车计时程序,基于单片机出租车计价器课题设计c语言编写(样例3)...
- 【C语言】在线OJ题 BC7-BC52-牛客网编程初学者入门训练
- 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例...
- APICS与AX的Master Planning(一)--Phantom bill of Material 虚项
- 基于SSM框架之众筹网站项目
- AnimMontage(中文翻译)——UE4官方文档
- 《当程序员的那些狗日日子》三
- 量子计算机王,王正汉|量子计算机:下一轮工业革命的引擎
- 人全外显子组测序WES学习笔记 第一天
- 在哪里设置自动锁定计算机,教你电脑锁屏怎么设置,让电脑自动锁屏
- vuex中辅助函数写法
- MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用
- 工作一年的收获与思考
- FileLock——Java文件锁
- python做地图热力图保存为png_Python如何实现热力图?可视化入库图实战演示
- OPENCV+VS2008+SQLserver图片存储数据库开发