文章目录

  • 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实现读写分离相关推荐

  1. Sharding-jdbc教程:Springboot整合sharding-jdbc实现读写分离

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! Sharding-JDBC简介 Sharding-JDBC是的分布式数据库中间件解决方案.Sha ...

  2. SpringBoot 整合 MyCat 实现读写分离

    作者:颜不喜 cnblogs.com/muycode/p/12603037.html MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量 ...

  3. shardingjdbc 实现读写分离

    一般读写分离,主库做增删改等操作,从库做查询操作.如果查询多的话,可以配置一主多从.SHARDINGJDBC 最开始是由当当网开始的一个开源项目.由于反响好,直接进入 apache 的孵化项目,更名为 ...

  4. Sharding-Jdbc 实现读写分离 + 分库分表,写得太好了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 来自:CSDN,作者:邋遢的流浪剑客 链接:https://blog.csdn.net/qq_40378034/article/de ...

  5. Sharding-Jdbc实现读写分离、分库分表,妙!

    点击关注公众号,实用技术文章及时了解 1.概览 ShardingSphere-Jdbc定位为轻量级Java框架,在Java的Jdbc层提供的额外服务.它使用客户端直连数据库,以jar包形式提供服务,可 ...

  6. Sharding-jdbc实现读写分离、分库分表

    一.简介 Sharding-jdbc官网:http://shardingsphere.apache.org/ 1.概述 a.Sharding-jdbc是一个开源的分布式的关系型数据库中间件 b.Sha ...

  7. SpringBoot 整合 Sharding-JDBC

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.sharding-jdbc简介 二.使用步骤 1.新建项目.引入依赖 2.代码实战 总结 前言 SpringBoo ...

  8. 三、Sharding-JDBC实现读写分离

    一.Sharding-JDBC实现读写分离 1.1.读写分离概念 为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务 ...

  9. Springboot整合Shiro前后端分离跨域问题

    Springboot整合Shiro前后端分离跨域问题 前言:SpringBoot整合shiro进行前后端分离开发时(前端是Vue),项目做了跨域配置,但还是前端请求会出现cros err–显示的跨域问 ...

最新文章

  1. 【广州.NET社区线下活动】云定未来 - Azure Meetup
  2. python 调用linux内核api_Linux系统调用及用户编程接口(API)学习
  3. Apache 反向代理,Laravel获取用户真实IP
  4. Kubernetes-服务连接和暴露(endpoints)(二十)
  5. 计算机算法设计与分析 递归实现快速排序和随机化实现快速排序
  6. Java接口default方法思考钻石问题
  7. 如何将Web of Science中的题录及文章导入NoteExpress?
  8. C#向一个Word文件中插入文字与图片
  9. Format函数详解
  10. Js、 replace 全部内容替换、替换全部匹配内容、替换第一个
  11. MongoDB启动shutting down with code:100处理
  12. 页面报错$injector:unpr
  13. Html+CSS 文本的强制换行
  14. 最近看的几部不错的电影
  15. java将字符串放置到剪切板
  16. 赛门铁克公司太不厚道
  17. 内网安全-流量隧道(一)不出网CS上线正反向端口转发
  18. 同步电机模型的SIMULINK仿真
  19. 店盈通:拼多多搜索推广出价多少才合适?有哪些技巧?
  20. 物联网(java版本)臻识摄像头+威视显示屏

热门文章

  1. 中国蔬菜种子行业竞争动态与营销趋势预测报告2022-2027年
  2. css中的div容器笔记
  3. SHA256Utils
  4. word双引号间距大_解决Word 2013的双引号尴尬
  5. 保姆级教程:深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)
  6. 剑网三重置版服务器维护,《剑网三》重制版基础教程,让你从入门萌新步入大佬行列...
  7. spring boot 整合 云之讯 demo
  8. Ansys-静力学分析-薄壁圆筒学习心得
  9. sio_socket, websocket的使用与封装
  10. 充分利用 cpu_如何充分利用云