Java开发 - 读写分离初体验

news2025/6/20 19:31:27

前言

上一篇中,我们介绍了主从复制,相信学过的小伙伴已经能够很好的掌握主从复制的技术,实际上也并没有那么难,虽然没有讲一主多从,多主多从的配置,但是从一主一从的配置中也很容易联想到该怎么配置,你没猜错,就是你想的那样。这篇博客,我们要讲解的东西是主从复制的应用——读写分离。一般来说,主从复制服务的对象就是读写分离,甚至于分库分表,否则完全没这个必要,今天,我们就来学习读写分离的实战应用。

ShardingJDBC

什么是ShardingJDBC

Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

Sharding-JDBC具有以下几个特点:

  • 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

为什么要使用ShardingJDBC

为什么要说ShardingJDBC呢?不是讲读写分离吗?是的,就是因为要读写分离,所以会引入多个数据源,而在我们SSM框架下,我们最多也就是引入一个datasource,所以我们只好放弃原来的配置,使用ShardingJDBC来解决多数据源的情况。

上面写的也只是其一,还有另一个重要的原因,数据在被操作的时候会有行锁,甚至表锁,如果这时候去访问这些被锁定的数据,你想想会怎么样?所以为了更好的进行读写操作,我们需要将读和写分开,这样就减轻了服务器压力,提高了服务器的利用率,同时还避免了这种情况,使得整个系统的查询性能得到极大的改善。

读写分离实战

项目准备

首先我们需要一个项目,你可以选择自己创建,但博主这里就不一步步来做了,直接使用前几日准备好的项目:Java开发 - SpringCache初体验

你也可以直接在自己已有的项目中集成,但首先需要配置好主从数据库,可参照这篇博客配置:Java开发 - MySQL主从复制初体验 

以上都准备好了,那么我们就进入到下一个环节。

添加依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>

添加配置

spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      names:
        master,slave
      # 主数据源
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://172.17.0.2:3306/master_slave?characterEncoding=utf-8
        username: root
        password: 0
      # 从数据源
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://172.17.0.4:3309/master_slave?characterEncoding=utf-8
        username: root
        password: 0
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin #轮询
      # 最终的数据源名称
      name: dataSource
      # 主库数据源名称
      master-data-source-name: master
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #开启SQL显示,默认false

里面的注释写的很详细,基本能看明白是啥,有两个东西,这里要着重说明下:

    props:
      sql:
        show: true #开启SQL显示,默认false

开启SQL显示博主曾在Java开发 - 拦截器初体验

中专门讲解过怎么通过拦截器输出SQL,但是看到没,这里有更简便的方式,但并不是说拦截器无用,拦截器的作用有很多,这只是其中一个。

spring:  
  main:
    allow-bean-definition-overriding: true

如果不配置该项,项目启动之后将会报错:

560dd7b08095405b9d061733ab780b24.png

 

报错信息表明,在声明 org.apache.shardingsphere.shardingjdbc.spring.boot 包下的SpringBootConfiguration中的dataSource这个bean时出错, 原因是有一个同名的 dataSource 的bean在com.alibaba.druid.spring.boot.autoconfigure包下的DruidDataSourceAutoConfigure类加载时已经声明了。

添加了此配置,当前项目中存在同名的bean,后定义的bean会覆盖先定义的。 而我们需要用到的是 shardingjdbc包下的dataSource,所以我们需要配置上述属性,让后加载的覆盖先加载的。

测试

一不小心,竟然快要写完了?其实博主已经说过,最重要的是配置,实际用的时候,代码不需要任何的变化,下面我们运行项目:

525d787359054377b7065ee519c0882f.png

然后我们发现这个IP完全无法访问,这是因为这个IP是docker内部id,博主查了很多资料,都没有很好的解决这个问题,但是,也看到了一些说法:

如何访问docker容器ip-Docker-PHP中文网

根据这篇博客,最终得到的结论就是,虽然无法直接访问docker内部ip,但是我们已经通过端口映射到了localhost的端口上,所以,可以把docker内部ip地址换成主机地址,也可以直接用localhost,port使用映射的端口就可以。

重新启动项目,没有再报出错误,我们使用mysql工具链接时也这么做,发现完全没有问题。

还有另一篇博客:

 解决docker宿主机不能访问容器的问题_docker宿主机访问不到容器 

这篇博客提出在创建容器的时候,容器与宿主机共享同一个网卡,不过博主没办法重新创建容器了,有兴趣的小伙伴自行尝试。 

下面通过postman来访问项目的接口地址添加用户:

66e283cb5cd0429b89af79197933149e.png

报错了,我们看看控制台输出: 

3c85bb6960e8435fabe1077e7d7d0264.png

 原来是我们前几篇博客里讲到的公共字段自动填充的锅,加了两个参数:create_time,update_time,为了能正常请求,我们在表里添加这两个字段:

alter table user add create_time DATETIME;
alter table user add update_time DATETIME;

96252a7f560d4d558f730d6edc1d5005.png

 主库已经有这两个字段了,我们看下从库 :

c4d3edcd8158410d86e30bbcdba37ccc.png

又验证了主从的实现是完全没问题的。下面重新用postman发起添加用户的请求:

20640fdf151145aa9377979a3b7fcfc0.png

添加成功,看下控制台输出和主库:

c20b1171b0c444b0a63d102a201c3bfd.png再看下从库:

63cc867ac3994b599c4c5f49cb5d18c0.png

可以从控制台看出,写操作是主库,主从数据库数据都添加进去了,下面我们来做查询操作,查询新添加的用户libai: d05deb43a0cb4715a8ba62c8c6e9c231.png

查询成功,看下控制台输出,因为此项目使用了Redis+SpringCache,所以不会查数据库,又是自己坑自己,我们清空下Redis缓存:

def08f84c55f4215a23872833da094fd.png

 然后再次查询:

ed1a656349b748049369c1ebb592ce9f.png

可以看到,查询的数据库是从数据库,到此,读写分离 测试完成。

结语

整个过程中出现了各种各样的问题,还有一些问题在博主的步骤中没有出现,但整体上流程都是没问题的,大家在自己做的时候细心点即可,差之毫厘,谬之千里啊!读写分离介绍完了,你学的怎么样呢?有没有学废?觉得不错就给博主点个赞吧!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年顶级编程语言趋势

对于开发人员和软件工程师来说&#xff0c;选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易&#xff0c;工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行&#xff0c;对当今最流行的编程语言的分析&#xff0c;可以帮助你了解最新趋势并响应最新趋势。…

4.5、协议

4.5、协议1.简介2.常见协议3.UDP协议4.TCP协议5.IP协议6.以太网帧协议7.ARP协议1.简介 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信…

JAVA NIO简解

1. 了解NIO 1.1.什么是NIO&#xff1f; Java nio是Java的一个新的输入输出&#xff08;NewInput/Output&#xff09;API&#xff0c;它提供了一些高效的数据处理方式&#xff0c;如缓冲区&#xff08;buffers&#xff09;、字符集&#xff08;charsets&#xff09;、通道&#…

No.036<软考>《(高项)备考大全》【第20章】项目集管理

【第20章】项目集管理1 考试相关2项目集合项目组合的区别2.1 项目组合、项目集、项目管理之间的关系&#xff1a;2.3 举例说三者的关系3 项目集管理3.1 项目集管理与项目管理区别3.2 项目集指导委员会3.3 项目集生命周期4 练习题参考答案1 考试相关 选择1分必考 案例概率低&am…

Ubuntu 23.04 新特性一览

Ubuntu 23.04 “Lunar Lobster” 计划于 2023 年 4 月 20 日星期四发布&#xff0c;这是 Ubuntu 桌面的第 38 个版本。作为一个短期版本&#xff0c;Ubuntu 23.04 共获得了 9 个月的持续更新、安全补丁和关键修复。 在正式发布之前&#xff0c;OMG! Ubuntu! 汇总整理了一些 Ub…

京东产发奔赴港股上市,分拆上市或成互联网大厂的共同选择?

‍数据智能产业创新服务媒体——聚焦数智 改变商业3月30日晚间&#xff0c;京东集团&#xff08;9618.HK&#xff09;相继发布2则公告称&#xff0c;拟分拆京东智能产发股份有限公司&#xff08;以下简称“京东产发”&#xff09;、京东工业股份有限公司&#xff08;以下简称“…

基于改进多目标灰狼优化算法的考虑V2G技术的风、光、荷、储微网多目标日前优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

( “树” 之 DFS) 404. 左叶子之和 ——【Leetcode每日一题】

404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1]…

当ChatGPT续写《红楼梦》,能替代原著吗?

来源: 清华大学出版社 近段时间&#xff0c;人工智能聊天机器人ChatGPT火爆网络&#xff0c;“AI写作是否会让文字工作者被替代&#xff1f;”成为人们关注并持续讨论的话题。 闲聊、问答、解题、写代码、写诗、创作小说&#xff0c; 连续回答&#xff0c;不断纠错&#xff0c…

window下面安装phpstudy进行PHP开发

文章目录前言在这里插入图片描述一、安装步骤1.1 下载PHPStudy软件1.2 安装PHPStudy软件1.3 启动PHPStudy软件1.4 设置PHPStudy1.5 安装扩展1.6 启动服务总结前言 php的集成开发环境比较多&#xff0c;有wamp server&#xff0c;xmapp&#xff0c;phpstudy等。经过这些年的体验…

【李宏毅】深度学习——HW5-Machine Translation

Machine Translation 1. Goal 给定一段英文&#xff0c;翻译成繁体中文 2. Introduction 2.1 Dataset training dataset TED2020: TED talks with transcriptions translated by a global community of volunteers to more than 100 language.we will use (en, zh-tw) alig…

身临其境数字世界:探索VR全景元宇宙展厅

随着科技的不断发展&#xff0c;虚拟现实技术已经成为我们生活中的一部分。VR全景元宇宙展厅作为其中的一种形式&#xff0c;正越来越受欢迎。在这里&#xff0c;您可以探索未知的世界&#xff0c;体验全新的视觉和感官体验。 一、VR全景元宇宙展厅的概述 VR全景元宇宙展厅是一…

Kafka---kafka概述和kafka基础架构

kafka概述和kafka基础架构 文章目录kafka概述和kafka基础架构Kafka定义消息队列传统消息队列应用场景缓存/消峰解耦异步通信消息队列的两种模式点对点模式发布/订阅模式kafka基础架构producerConsumerConsumer Group&#xff08;CG&#xff09;BrokerTopicPartitionReplicaLead…

基于html+css的盒子内容旋转180度

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

如何学习python自动化测试,这是我见过最完整的教程了

目录 前言 一、 学习Python基础知识 二、 学习自动化测试框架 三、 学习Web自动化测试 四、 学习移动端自动化测试 五、 学习版本控制工具 六、 学习测试管理工具 七、 实践总结 前言 Python自动化测试是目前比较流行的一种自动化测试技术。它具有开发效率高、可扩展性…

《c++入门》-超级详细讲解

本文主要介绍c的一些入门知识&#xff0c;为后面打基础 文章目录前言1、C关键字(C98)2、命名空间2.1 命名空间定义2.2 命名空间使用1.指定命名空间2.全局展开&#xff08;一般情况&#xff0c;不建议全局展开&#xff09;3.部分展开3、C输入&输出4、缺省参数4.1 缺省参数定…

人工智能(Pytorch)搭建T5模型,真正跑通T5模型,用T5模型生成数字加减结果

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(Pytorch)搭建T5模型,真正跑通T5模型,用T5模型生成数字加减结果。T5&#xff08;Text-to-Text Transfer Transformer&#xff09;是一种由Google Brain团队在2019年提出的自然语言处理模型。T5模型基于Tran…

商办楼宇租赁过程中的风险与管控

在商办地产租赁市场持续高量供应、越来越多楼盘趋向同质化的背景下&#xff0c;商办地产经营需更懂得审时度势&#xff0c;在租赁经营过程中合理运用数字化管理识别、规避风险&#xff0c;针对有风险的经营及时调整管控&#xff0c;提升识别及防范风险的意识和能力&#xff0c;…

数据结构:链表oj下

21. 合并两个有序链表 CM11 链表分割 不加36行代码会造成死循环&#xff08;形成环&#xff09; OR36 链表的回文结构 找到中间节点&#xff0c;再把后面的逆置 走完一个链表while(tail) 找链表的最后一个节点while(tail->next) 160. 相交链表 找到AB链表的尾节点&#x…

Python 小型项目大全 6~10

六、凯撒密码 原文&#xff1a;http://inventwithpython.com/bigbookpython/project6.html 凯撒密码是朱利叶斯凯撒使用的一种古老的加密算法。它通过将字母在字母表中移动一定的位置来加密字母。我们称移位的长度为密钥。比如&#xff0c;如果密钥是 3&#xff0c;那么A变成D&…