SpringBoot+JPA整合ShardingShpere实现分表-读写分离

news/2024/11/30 20:32:44/

ShardingShpere 分表分库+读写分离

​ ShardingShpere 提供来了根据某个字段分库分表的功能和读写分离。

读写分离

当主服务有写入(insert/update/delete)语句时,从服务器自动获取。

  • 写入线程从 master 数据库查询
  • 查询线程从 salve 数据库获取数据

ShardingShpere 源码

版本依赖

  • JDK 8
  • SpringBoot 2.4.3
  • ShardingShpere 5.0

创建两个数据库 master0、master1,每个库包含三张表 user_0、user_1、user_2。

CREATE DATABASE `master0` CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `master1` CHARACTER SET utf8 COLLATE utf8_general_ci;
use master0;
DROP TABLE IF EXISTS user_0;
CREATE TABLE `user_0` (`id` bigint(20) UNSIGNED NOT NULL,`email` varchar(255) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS user_1;
CREATE TABLE `user_1` (`id` bigint(20) UNSIGNED NOT NULL,`email` varchar(255) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS user_2;
CREATE TABLE `user_2` (`id` bigint(20) UNSIGNED NOT NULL,`email` varchar(255) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

添加 application.yml

spring:jpa:properties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5Dialectshow_sql: falseshardingsphere:datasource:names: master0,slave0,master1,slave1common:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcemaster0:jdbc-url: jdbc:mysql://172.28.128.3:3306/master0?serverTimezone=UTC&useSSL=falseusername: rootpassword: Test@122master1:jdbc-url: jdbc:mysql://172.28.128.3:3306/master1?serverTimezone=UTC&useSSL=falseusername: rootpassword: Test@122slave0:jdbc-url: jdbc:mysql://172.28.128.4:3306/master0?serverTimezone=UTC&useSSL=falseusername: rootpassword: Test@123slave1:jdbc-url: jdbc:mysql://172.28.128.4:3306/master1?serverTimezone=UTC&useSSL=falseusername: rootpassword: Test@123rules:sharding:sharding-algorithms:database-inline:type: INLINEprops:algorithm-expression: master$->{ id % 2 }table-inline:type: INLINEprops:algorithm-expression: user_$->{ id % 3 }key-generators:snowflake:type: SNOWFLAKEprops:worker-id: 123tables:user:actual-data-nodes: master$->{0..1}.user_$->{0..2}key-generate-strategy:column: idkey-generator-name: snowflakedatabase-strategy:standard:sharding-column: idsharding-algorithm-name: database-inlinetable-strategy:standard:sharding-column: idsharding-algorithm-name: table-inlinereadwrite-splitting:load-balancers:round_robin:type: ROUND_ROBINdata-sources:master0:write-data-source-name: master0read-data-source-names: slave0master1:write-data-source-name: master1read-data-source-names: slave1props:sql-show: true

运行测试类,登陆Mysql服务器,查看结果:

在这里插入图片描述

在这里插入图片描述

验证:写入线程从 master 数据库查询

主从数据库进程启动。模拟新增请求:curl -X POST -d 'name="test10"&email="mail10"' http://127.0.0.1:8080/user/add,关闭slave数据库进程,模拟请求查询:http://localhost:8080/user/all,master数据库查询结果如下:

在这里插入图片描述

验证:查询线程从 salve 数据库获取数据

关闭master数据库进程,slave数据库进程开启。模拟新增请求:$ curl -X POST -d 'name="test13"&email="mail13"' http://127.0.0.1:8080/user/add,后端日志提示连接失败。 模拟查询请求: http://localhost:8080/user/all,slave数据库查询结果如下:

在这里插入图片描述

参考

https://shardingsphere.apache.org/document/current/cn/overview/

https://github.com/apache/shardingsphere/tree/master/examples

问题:ERROR 12506 — [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Data truncation: Out of range value for column ‘id’ at row 1

解决:数据库字段 id 改为 bitInt 类型,实体类 id 改为 Long 类型。


http://www.ppmy.cn/news/534213.html

相关文章

oracle imp导入dmp文件报12506错误解决办法

通过imp导入数据库dmp文件出错解决办法: IMP-00058: 遇到 ORACLE 错误 12560 ORA-12560: TNS: 协议适配器错误 IMP-00000: 未成功终止导入 遇到这个问题后,很多人会认为是本地服务名的原因,但经过测试,发现服务名是正常的。如果服…

Python知识点复习(一)

问1:f.seek(6, 0)的作用是什么? 答1:将文件对象f的指针从开始的位置偏移到6个字节的位置 拓展: 这是Python中文件操作的一个方法,其中f是一个已经打开的文件对象。该方法的第一个参数表示文件偏移量(offset),即从文件的起始位置开始向后移动的字节数,第二个参数表示偏移…

MySQL - 第7节 - MySQL内置函数

1.日期函数 1.1.常用的日期函数 常用的日期函数如下: 1.2.current_date函数 current_date函数用于获取当前的日期。如下: 1.3.current_time函数 current_time函数用于获取当前的时间。如下: 1.4.current_timestamp函数 current_timestamp函数…

Mysql高级查询语句

数据库是用来存储数据,更新,查询数据的工具,而查询数据是一个数据库最为核心的功能,数据库是用来承载信息,而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查询语句展开。…

PID相关参数讲解:1、比例系数Kp与静态误差

PID的结构与公式 来研究静态误差的同学,应该是对PID的原理有一定理解了,简单的概念也不用过多重复。 比例控制时PID控制中最简单的一个,很多能用代码编写PID代码的同学,也不一定理解这个比例系数Kp的意义,以及比例控制…

网络作业10【计算机网络】

网络作业10【计算机网络】 前言推荐网络作业10一. 单选题(共13题,68.2分)二. 多选题(共4题,21.2分)三. 阅读理解(共2题,10.6分) 练习5-39 最后 前言 2023-6-23 15:35:39…

选择进口血糖仪的几个小建议,可收藏

对于买过家用血糖仪的小伙伴一定遇过这样的难题,强生,罗氏,真睿等五花八门的品牌,虹吸式、免调码、滴血式这么多看不懂的名词,真的一秒钟变成选择困难的天秤座啊.... 相信大家在咨询过后一定得知现在选择进口血糖仪的小…

qt读写文本文件

使用QFile类进行读写,使用Open函数打开文件,打开方式有: QIODevice::NotOpen 0x0000 不打开 QIODevice::ReadOnly 0x0001 只读方式 QIODevice::WriteOnly 0x0002 只写方式,如果文件不存在则会自动创建文件 QIODevice::ReadWri…