Java开发 - 读写分离初体验

【Java】 Java MySQL 实现读写分离方案 - 配置连接池 -->-- 数据库驱动 -->-- 相应驱动的jdbcUrl -->-- 数据库的用户名 -->-- 数据库的密码 -->-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->-- 每个分区最大的连接数 -->-- 每个分区最小的连接数 --></bean>-- 配置连接池 -->-- 数据库驱动 --> 阅读详情

前言

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

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

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

结语

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

 

MyCat教程【读写分离】,java开发工程师面试题 JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算… 阅读详情

相关推荐

头歌springboot初体验

描述:使用Spring Boot的spring-boot-devtools依赖,开发者可以在不重启整个应用的情况下,实。课程的学习,学习者将能够掌握Spring Boot的核心技术和实践应用,为后续的Java Web开发打下坚。定义:Spring Boot是一个开源的Java开发框架,旨在简化Spring应用的初始搭建和开发过程。内容:课程内容包括Spring Boot的介绍、环境搭建、项目创建、基本配置、常用注解、自动配置、

2401_84235249的博客 1240

java项目中使用sharding实现读写分离

java项目中sharding实现读写分离

weixin_41943486的博客 475

Java开发:Spring Boot的数据库读写分离实现

在现代的应用系统中,随着业务的发展和用户量的增加,数据库的读写压力也越来越大。为了提高数据库的性能和吞吐量,数据库读写分离成为了一种常用的解决方案。本文章的目的就是详细介绍如何在Spring Boot项目中实现数据库的读写分离。我们将涵盖从基础概念的讲解,到具体的代码实现,再到实际应用场景的分析等多个方面,帮助读者全面了解和掌握Spring Boot中数据库读写分离的实现方法。本文将按照以下结构进行组织:首先介绍数据库读写分离的核心概念和它们之间的联系,包括主从数据库架构、读写分离原理等;

Java大师兄的博客 863

Java 实现数据库读写分离竟如此简单?

面对日益增加的系统访问量,数据库的吞吐量面临着巨大的瓶颈,可能有些服务器性能好,有些服务器的性能不好,我们就可以将数据库拆分为主库和从库,从而实现读写分离

一切总会归于平淡 3326

Java分布式数据源分表分库、读写分离应用层框架:j360-datasource

NULL 博文链接:https://zzc1684.iteye.com/blog/2339523

服务读写分离架构

互联网微服务架构,应该按照“子业务”进行微服务拆分,而不应该按照“读写”来进行微服务拆分,避免过度设计。

Java之读写分离实现

主要介绍通过ShardingJDBC实现读写分离,并介绍如何搭建MySQL主从复制架构

CharlesYan的博客 3218

JAVA数据库读写分离项目源码(MYSQL)

JAVA数据库读写分离项目源码(MYSQL),非常详细的注解,ssm框架开发,能使你快速掌握读写分离技术!!!

Java实现读写分离

1.背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是从库,负责读取数据,我们称之为:读库; 那么,对我们的要求是: 1、读库和写库的数据一致;(这个是很重要的一个问题,处理业务逻辑要放在service层去处理,不要在dao或者mapper层面去处理) 2、写数据必须写到写库; 3、读数据必须到读库; 2.方案 解决读写分离的方案有两种:应用层...

qq_33327680的博客 5893

Android设置鼠标显示的屏幕

【代码】Android设置鼠标显示的屏幕。

薛文旺 675

PyTorch实战:手把手教你用QAT量化感知训练拯救模型精度(附避坑指南)

本文详细介绍了如何使用PyTorch进行QAT量化感知训练,以提升模型在边缘设备上的推理精度。通过核心原理讲解、实战代码示例和避坑指南,帮助开发者掌握从环境配置、模型训练到边缘部署的全流程,有效解决传统量化方法导致的精度损失问题。

c7d8e的博客 330

Java开发中如何配合MySQL实现读写分离?

读写分离是一种有效的数据库架构设计,可以显著提高系统的性能和可扩展性。在Java开发中,通过合理的配置和设计,可以实现MySQL的读写分离。尽管读写分离带来了数据一致性和复杂性等挑战,但通过适当的策略和工具,可以有效地管理这些问题。在实际应用中,开发者需要根据具体的业务需求和系统架构,选择合适的读写分离方案,并进行持续的监控和优化,以确保系统的高可用性和高性能。

梦在硅谷的博客 1766

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6507

Java 编程初体验

在 Java 编程的初体验中,我们从环境搭建到写出第一个程序,再到学习数据类型、控制流程语句和面向对象编程基础,每一步都充满了挑战和惊喜。Java 编程的严谨性和逻辑性让我们体会到了编程的魅力,同时也锻炼了我们的思维能力。安装完成后,还需要配置环境变量,将 JDK 的 bin 目录添加到系统的 PATH 变量中,这样系统才能找到 Java 相关的命令。编写完代码后,我们可以点击 IDE 中的运行按钮,或者使用快捷键来运行程序。Java 是一门面向对象的编程语言,类是对象的抽象描述,而对象是类的具体实例。

zsnandzmn的博客 1万+

从寄存器到驱动:深入解读RFSoC RF-ADC阈值与校准API的底层逻辑

本文深入解析Xilinx RFSoC中RF-ADC的阈值检测与校准API的底层逻辑,涵盖寄存器映射、驱动实现及Gen3增强功能。通过详细代码示例和寄存器操作流程,揭示如何精准控制信号阈值检测与校准时序,提升系统稳定性与性能。特别探讨RF数据转换器在无线通信和雷达信号处理中的关键应用。

weixin_30552811的博客 687

RTL8211F千兆PHY原理图与PCB设计:从手册到量产的完整指南

在工业网关、边缘计算和FPGA/CPU以太网扩展设计中,千兆PHY芯片的稳定运行取决于外围电路的精细设计。RTL8211F(I)作为应用广泛的物理层收发器,其原理图设计涉及电源域划分、时钟与复位时序、RGMII/ MDIO接口匹配以及MDI差分网络等多个环节。正确理解数据手册的阅读顺序,掌握100Ω差分阻抗控制、等长约束和EMI布局技巧,是保证链路可靠性和信号完整性的关键。本文从芯片选型与数据手册解析切入,系统梳理从电源去耦到PCB布局布线的工程实践要点,帮助工程师规避Link不稳定、MDIO读取失败、吞吐

weixin_28721917的博客 354

【Java开发300个实用技巧】220.读写分离MyCat

本文系统构建百万级数据架构的完整知识体系:1)通过MyCat智能路由实现读写请求自动分离,采用主从同步+负载均衡组合拳解决单库性能瓶颈;2)基于SQL解析引擎实现透明化分片,避免硬编码数据源导致的维护噩梦;3)结合分布式事务补偿机制,确保跨节点操作的数据一致性。记住高性能数据库架构=30%读写分离+25%连接池优化+20%慢查询治理+15%索引优化+10%硬件配置,当你的系统能在1万QPS压力下保持20ms平均响应时,就真正掌握了高并发的金钥匙。从今天起,让MyCat成为你数据库架构的智能调度中枢,而非性能

1450

SpeedyBee F405 V3 50A飞塔装机全攻略:从开箱到首飞避坑指南

本文提供SpeedyBee F405 V3 50A飞塔的详细装机指南,涵盖从开箱检查、硬件焊接、软件配置到安全首飞的全流程。重点剖析了电源连接、固件刷写等高频故障点,帮助FPV新手避开常见陷阱,确保一次成功组装并安全起飞。

weixin_29179311的博客 417

HarmonyOS开发初体验

下载IDE HUAWEI DevEco Studio 2.0:https://developer.huawei.com/consumer/cn/deveco_studio 获取下载资源时需要实名认证 HarmonyOS开发文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/harmonyos-overview-0000000000011903 配置开发环境 / 安装DevEco 目前HarmonyOS支持用Java

不止于代码 7486

17、扩展景深成像的瞳孔函数工程技术解析

本文详细解析了扩展景深成像的关键技术,包括基于焦距堆栈的数字处理方法、立方相位掩模的光学设计、对数非球面透镜的应用以及旋转点扩散函数的深度编码功能。通过实验验证和实际应用分析,展示了这些技术在显微镜成像、工业检测和医疗影像中的广泛用途及优势。同时探讨了未来发展方向,如智能算法优化、新型光学材料和多模态成像技术,为相关领域的技术创新提供了参考。

y2z3a4b5c的博客 169

Altium Designer(AD24/25)PCB编辑的几种方法介绍

本文介绍了Altium Designer(AD24/25)软件中PCB编辑的四种操作方法:1)通过菜单栏"Place→Component"激活;2)点击工具栏元器件图标;3)右键快捷菜单选择;4)快捷键P+C组合操作。建议初学者先通过菜单栏和快捷菜单熟悉操作,熟练后转为工具栏和快捷键以提高效率。文章配有操作示意图,帮助用户快速掌握PCB元器件放置技巧。

fydar的博客 947

java初体验

java初体验 java的注释 注释(comment):

qq56hm的博客 418

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mycat读写分离 初体验

公司项目要做数据库读写分离,直接代码撸读写分离工作量太庞大了,还是考虑用mycat中间件来做。 下载 mycat官网 mycat下载地址 下载了 Mycat-server-1.6.7.3-release 版本发布 mycat监控 java运行环境不可少,安装略。本人用的是jdk1.8.0_131 mycat安装目录 目录 说明 bin mycat命令,启动、重启、停止等 catlet catlet为Mycat的一个扩展功能 conf 配置文件,核心 lib 引用jar包 .

weedmmg的专栏 336

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【Java项目 读写分离技术】

Java项目 配置Sharding-JDBC 实现读写分离技术,以及如何实现Mysql主从同步(实现主从复制的步骤)

独上高楼,望尽天涯路。 1542

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

读写分离

一、读写分离 1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、 DELETE) ,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什么要读写分离呢? 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库的“读”(读10000条数据可能只要5秒钟) 所以读写分离,解决的是,数据库的写入,影响了查询的效率。 3、什么时候要读写分离? 数据库不一定要读写

weixin_48872590的博客 9417

【Java开发300个实用技巧】180.动态数据源读写分离

Phaser是Java并发编程中的一个强大工具,能够有效解决CyclicBarrier在多线程协同中的三大短板:动态线程数量调整、多阶段任务支持和分层同步结构。通过Phaser,开发者可以灵活地注册和注销线程,适应任务数量不确定的场景,避免线程死锁。此外,Phaser支持多阶段任务同步,适用于复杂任务流程,如游戏关卡加载。其分层同步结构还能构建复杂的任务协作网络,如物流分拣系统。Phaser还提供了灵活的异常处理机制,确保系统在出现异常时仍能正常运行。总之,Phaser为多线程协同提供了更高效、更灵活的解决

845
上一篇: Java开发 - MySQL主从复制初体验
下一篇: Java开发 - 不知道算不算详细的JUC详解
CodingFire
CodingFire  2022年度博客之星移动开发领域TOP 5 2022年度博客之星移动开发领域TOP 5 领域专家: 移动开发技术领域 领域专家: 移动开发技术领域
博客等级 码龄11年 7927粉丝 387原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingFire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值