shardingsphere: SpringBoot整合shardingjdbc实现读写分离
文章目录
- 1. 引入jar包
- 2. 编写application.properties
- 3. 事务测试
- 3.1 测试代码
- 附录
1. 引入jar包
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.0</version>
</dependency>
2. 编写application.properties
#模式设置
spring.shardingsphere.mode.type=Standalone
#日志打印
spring.shardingsphere.props.sql-show=true# 配置真实数据源
spring.shardingsphere.datasource.names=write,read1,read2
# 配置第 1 个数据源
spring.shardingsphere.datasource.write.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.write.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.write.jdbc-url=jdbc:mysql://xx.xx.xxx.xx:3306/testdb?useUnicode=true&characterEncoding=utf8
spring.shardingsphere.datasource.write.username=root
spring.shardingsphere.datasource.write.password=xxxxxx
# 配置第 2 个数据源
spring.shardingsphere.datasource.read1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.read1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.read1.jdbc-url=jdbc:mysql://xx.xx.xxx.xx:3307/testdb?useUnicode=true&characterEncoding=utf8
spring.shardingsphere.datasource.read1.username=root
spring.shardingsphere.datasource.read1.password=xxxxxx
# 配置第 3 个数据源
spring.shardingsphere.datasource.read2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.read2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.read2.jdbc-url=jdbc:mysql://xx.xx.xxx.xx:3308/testdb?useUnicode=true&characterEncoding=utf8
spring.shardingsphere.datasource.read2.username=root
spring.shardingsphere.datasource.read2.password=xxxxxx#读写分离配置
#写库数据源
spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.static-strategy.write-data-source-name=write
#读库数据源(多个从数据源用逗号分隔)
spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.static-strategy.read-data-source-names=read1,read2#负载均衡配置
spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.load-balancer-name=round_robin
#负载均衡算法
spring.shardingsphere.rules.readwrite-splitting.load-balancers.round_robin.type=ROUND_ROBIN
3. 事务测试
3.1 测试代码
@RequestMapping("/insertData")public Object test2() throws InterruptedException {int random = (int) (Math.random() * 1000 + 1);String randomUsername = "王二" + random;User user = new User();user.setUname(randomUsername);int insert = userMapper.insert(user);if (insert > 0) {log.info("数据插入成功:{}", JSONObject.toJSONString(user));}//数据查询List<User> queryUsername1 = userMapper.selectList(new QueryWrapper<User>().eq("uname", randomUsername));log.info("数据查询1:{}", JSONObject.toJSONString(queryUsername1));List<User> queryUsername2 = userMapper.selectList(new QueryWrapper<User>().eq("uname", randomUsername));log.info("数据查询2:{}", JSONObject.toJSONString(queryUsername2));return queryUsername1;}
日志查看
2022-10-31 14:48:33.999 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : Logic SQL: INSERT INTO t_user ( uname ) VALUES ( ? )
2022-10-31 14:48:33.999 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : SQLStatement: MySQLInsertStatement(super=InsertStatement(super=AbstractSQLStatement(parameterCount=1, parameterMarkerSegments=[ParameterMarkerExpressionSegment(startIndex=41, stopIndex=41, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)], commentSegments=[]), table=SimpleTableSegment(tableName=TableNameSegment(startIndex=12, stopIndex=17, identifier=IdentifierValue(value=t_user, quoteCharacter=NONE)), owner=Optional.empty, alias=Optional.empty), insertColumns=Optional[InsertColumnsSegment(startIndex=20, stopIndex=28, columns=[ColumnSegment(startIndex=22, stopIndex=26, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty)])], insertSelect=Optional.empty, values=[InsertValuesSegment(startIndex=39, stopIndex=43, values=[ParameterMarkerExpressionSegment(startIndex=41, stopIndex=41, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)])]), setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
2022-10-31 14:48:34.000 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : Actual SQL: write ::: INSERT INTO t_user ( uname ) VALUES ( ? ) ::: [王二563]
2022-10-31 14:48:34.127 INFO 23376 --- [nio-8080-exec-1] c.q.p.controller.ShardingController : 数据插入成功:{"id":23,"uname":"王二563"}
2022-10-31 14:48:34.216 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : Logic SQL: SELECT id,uname FROM t_user WHERE (uname = ?)
2022-10-31 14:48:34.216 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : SQLStatement: MySQLSelectStatement(super=SelectStatement(super=AbstractSQLStatement(parameterCount=1, parameterMarkerSegments=[ParameterMarkerExpressionSegment(startIndex=49, stopIndex=49, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)], commentSegments=[]), projections=ProjectionsSegment(startIndex=8, stopIndex=15, projections=[ColumnProjectionSegment(column=ColumnSegment(startIndex=8, stopIndex=9, identifier=IdentifierValue(value=id, quoteCharacter=NONE), owner=Optional.empty), alias=Optional.empty), ColumnProjectionSegment(column=ColumnSegment(startIndex=11, stopIndex=15, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty), alias=Optional.empty)], distinctRow=false), from=SimpleTableSegment(tableName=TableNameSegment(startIndex=23, stopIndex=28, identifier=IdentifierValue(value=t_user, quoteCharacter=NONE)), owner=Optional.empty, alias=Optional.empty), where=Optional[WhereSegment(startIndex=34, stopIndex=50, expr=BinaryOperationExpression(startIndex=41, stopIndex=49, left=ColumnSegment(startIndex=41, stopIndex=45, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty), right=ParameterMarkerExpressionSegment(startIndex=49, stopIndex=49, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty), operator==, text=uname = ?))], groupBy=Optional.empty, having=Optional.empty, orderBy=Optional.empty, combines=[]), table=Optional.empty, limit=Optional.empty, lock=Optional.empty, window=Optional.empty)
2022-10-31 14:48:34.216 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : Actual SQL: read1 ::: SELECT id,uname FROM t_user WHERE (uname = ?) ::: [王二563]
2022-10-31 14:48:34.751 INFO 23376 --- [nio-8080-exec-1] c.q.p.controller.ShardingController : 数据查询1:[{"id":23,"uname":"王二563"}]
2022-10-31 14:48:34.756 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : Logic SQL: SELECT id,uname FROM t_user WHERE (uname = ?)
2022-10-31 14:48:34.756 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : SQLStatement: MySQLSelectStatement(super=SelectStatement(super=AbstractSQLStatement(parameterCount=1, parameterMarkerSegments=[ParameterMarkerExpressionSegment(startIndex=49, stopIndex=49, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)], commentSegments=[]), projections=ProjectionsSegment(startIndex=8, stopIndex=15, projections=[ColumnProjectionSegment(column=ColumnSegment(startIndex=8, stopIndex=9, identifier=IdentifierValue(value=id, quoteCharacter=NONE), owner=Optional.empty), alias=Optional.empty), ColumnProjectionSegment(column=ColumnSegment(startIndex=11, stopIndex=15, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty), alias=Optional.empty)], distinctRow=false), from=SimpleTableSegment(tableName=TableNameSegment(startIndex=23, stopIndex=28, identifier=IdentifierValue(value=t_user, quoteCharacter=NONE)), owner=Optional.empty, alias=Optional.empty), where=Optional[WhereSegment(startIndex=34, stopIndex=50, expr=BinaryOperationExpression(startIndex=41, stopIndex=49, left=ColumnSegment(startIndex=41, stopIndex=45, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty), right=ParameterMarkerExpressionSegment(startIndex=49, stopIndex=49, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty), operator==, text=uname = ?))], groupBy=Optional.empty, having=Optional.empty, orderBy=Optional.empty, combines=[]), table=Optional.empty, limit=Optional.empty, lock=Optional.empty, window=Optional.empty)
2022-10-31 14:48:34.756 INFO 23376 --- [nio-8080-exec-1] ShardingSphere-SQL : Actual SQL: read2 ::: SELECT id,uname FROM t_user WHERE (uname = ?) ::: [王二563]
2022-10-31 14:48:35.300 INFO 23376 --- [nio-8080-exec-1] c.q.p.controller.ShardingController : 数据查询2:[{"id":23,"uname":"王二563"}]
注意: 从上述日志中可以看到,在一次请求中,执行数据插入与数据查询时,数据插入操作的是write
数据源,而数据读取操作的是另外两个read
数据源,因为数据同步的问题,这样后续可能会存在重大隐患!
当我们给上述代码加上@Transactional
注解后,再次执行观察日志
2022-10-31 14:53:27.866 INFO 18800 --- [nio-8080-exec-1] ShardingSphere-SQL : Logic SQL: INSERT INTO t_user ( uname ) VALUES ( ? )
2022-10-31 14:53:27.866 INFO 18800 --- [nio-8080-exec-1] ShardingSphere-SQL : SQLStatement: MySQLInsertStatement(super=InsertStatement(super=AbstractSQLStatement(parameterCount=1, parameterMarkerSegments=[ParameterMarkerExpressionSegment(startIndex=41, stopIndex=41, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)], commentSegments=[]), table=SimpleTableSegment(tableName=TableNameSegment(startIndex=12, stopIndex=17, identifier=IdentifierValue(value=t_user, quoteCharacter=NONE)), owner=Optional.empty, alias=Optional.empty), insertColumns=Optional[InsertColumnsSegment(startIndex=20, stopIndex=28, columns=[ColumnSegment(startIndex=22, stopIndex=26, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty)])], insertSelect=Optional.empty, values=[InsertValuesSegment(startIndex=39, stopIndex=43, values=[ParameterMarkerExpressionSegment(startIndex=41, stopIndex=41, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)])]), setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
2022-10-31 14:53:27.866 INFO 18800 --- [nio-8080-exec-1] ShardingSphere-SQL : Actual SQL: write ::: INSERT INTO t_user ( uname ) VALUES ( ? ) ::: [王二737]
2022-10-31 14:53:28.892 INFO 18800 --- [nio-8080-exec-1] c.q.p.controller.ShardingController : 数据插入成功:{"id":24,"uname":"王二737"}
2022-10-31 14:53:29.001 INFO 18800 --- [nio-8080-exec-1] ShardingSphere-SQL : Logic SQL: SELECT id,uname FROM t_user WHERE (uname = ?)
2022-10-31 14:53:29.001 INFO 18800 --- [nio-8080-exec-1] ShardingSphere-SQL : SQLStatement: MySQLSelectStatement(super=SelectStatement(super=AbstractSQLStatement(parameterCount=1, parameterMarkerSegments=[ParameterMarkerExpressionSegment(startIndex=49, stopIndex=49, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty)], commentSegments=[]), projections=ProjectionsSegment(startIndex=8, stopIndex=15, projections=[ColumnProjectionSegment(column=ColumnSegment(startIndex=8, stopIndex=9, identifier=IdentifierValue(value=id, quoteCharacter=NONE), owner=Optional.empty), alias=Optional.empty), ColumnProjectionSegment(column=ColumnSegment(startIndex=11, stopIndex=15, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty), alias=Optional.empty)], distinctRow=false), from=SimpleTableSegment(tableName=TableNameSegment(startIndex=23, stopIndex=28, identifier=IdentifierValue(value=t_user, quoteCharacter=NONE)), owner=Optional.empty, alias=Optional.empty), where=Optional[WhereSegment(startIndex=34, stopIndex=50, expr=BinaryOperationExpression(startIndex=41, stopIndex=49, left=ColumnSegment(startIndex=41, stopIndex=45, identifier=IdentifierValue(value=uname, quoteCharacter=NONE), owner=Optional.empty), right=ParameterMarkerExpressionSegment(startIndex=49, stopIndex=49, parameterMarkerIndex=0, parameterMarkerType=QUESTION, alias=Optional.empty), operator==, text=uname = ?))], groupBy=Optional.empty, having=Optional.empty, orderBy=Optional.empty, combines=[]), table=Optional.empty, limit=Optional.empty, lock=Optional.empty, window=Optional.empty)
2022-10-31 14:53:29.002 INFO 18800 --- [nio-8080-exec-1] ShardingSphere-SQL : Actual SQL: write ::: SELECT id,uname FROM t_user WHERE (uname = ?) ::: [王二737]
2022-10-31 14:53:29.172 INFO 18800 --- [nio-8080-exec-1] c.q.p.controller.ShardingController : 数据查询1:[{"id":24,"uname":"王二737"}]
2022-10-31 14:53:29.173 INFO 18800 --- [nio-8080-exec-1] c.q.p.controller.ShardingController : 数据查询2:[{"id":24,"uname":"王二737"}]
此时可以看到,在一次请求中,执行写入和查询时,操作的都是write
数据源,从而规避掉上述提到的数据同步的风险
附录
注意参考官方文档的时候,YAML 配置
部分并不是
说springboot中的yml配置文件的配置方式,一定要注意!!
参考文档:https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/
shardingsphere: SpringBoot整合shardingjdbc实现读写分离相关推荐
- Sharding-jdbc教程:Springboot整合sharding-jdbc实现读写分离
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! Sharding-JDBC简介 Sharding-JDBC是的分布式数据库中间件解决方案.Sha ...
- SpringBoot 整合 MyCat 实现读写分离
作者:颜不喜 cnblogs.com/muycode/p/12603037.html MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量 ...
- shardingjdbc 实现读写分离
一般读写分离,主库做增删改等操作,从库做查询操作.如果查询多的话,可以配置一主多从.SHARDINGJDBC 最开始是由当当网开始的一个开源项目.由于反响好,直接进入 apache 的孵化项目,更名为 ...
- Sharding-Jdbc 实现读写分离 + 分库分表,写得太好了!
欢迎关注方志朋的博客,回复"666"获面试宝典 来自:CSDN,作者:邋遢的流浪剑客 链接:https://blog.csdn.net/qq_40378034/article/de ...
- Sharding-Jdbc实现读写分离、分库分表,妙!
点击关注公众号,实用技术文章及时了解 1.概览 ShardingSphere-Jdbc定位为轻量级Java框架,在Java的Jdbc层提供的额外服务.它使用客户端直连数据库,以jar包形式提供服务,可 ...
- Sharding-jdbc实现读写分离、分库分表
一.简介 Sharding-jdbc官网:http://shardingsphere.apache.org/ 1.概述 a.Sharding-jdbc是一个开源的分布式的关系型数据库中间件 b.Sha ...
- SpringBoot 整合 Sharding-JDBC
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.sharding-jdbc简介 二.使用步骤 1.新建项目.引入依赖 2.代码实战 总结 前言 SpringBoo ...
- 三、Sharding-JDBC实现读写分离
一.Sharding-JDBC实现读写分离 1.1.读写分离概念 为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务 ...
- Springboot整合Shiro前后端分离跨域问题
Springboot整合Shiro前后端分离跨域问题 前言:SpringBoot整合shiro进行前后端分离开发时(前端是Vue),项目做了跨域配置,但还是前端请求会出现cros err–显示的跨域问 ...
最新文章
- 【广州.NET社区线下活动】云定未来 - Azure Meetup
- python 调用linux内核api_Linux系统调用及用户编程接口(API)学习
- Apache 反向代理,Laravel获取用户真实IP
- Kubernetes-服务连接和暴露(endpoints)(二十)
- 计算机算法设计与分析 递归实现快速排序和随机化实现快速排序
- Java接口default方法思考钻石问题
- 如何将Web of Science中的题录及文章导入NoteExpress?
- C#向一个Word文件中插入文字与图片
- Format函数详解
- Js、 replace 全部内容替换、替换全部匹配内容、替换第一个
- MongoDB启动shutting down with code:100处理
- 页面报错$injector:unpr
- Html+CSS 文本的强制换行
- 最近看的几部不错的电影
- java将字符串放置到剪切板
- 赛门铁克公司太不厚道
- 内网安全-流量隧道(一)不出网CS上线正反向端口转发
- 同步电机模型的SIMULINK仿真
- 店盈通:拼多多搜索推广出价多少才合适?有哪些技巧?
- 物联网(java版本)臻识摄像头+威视显示屏
热门文章
- 中国蔬菜种子行业竞争动态与营销趋势预测报告2022-2027年
- css中的div容器笔记
- SHA256Utils
- word双引号间距大_解决Word 2013的双引号尴尬
- 保姆级教程:深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)
- 剑网三重置版服务器维护,《剑网三》重制版基础教程,让你从入门萌新步入大佬行列...
- spring boot 整合 云之讯 demo
- Ansys-静力学分析-薄壁圆筒学习心得
- sio_socket, websocket的使用与封装
- 充分利用 cpu_如何充分利用云