Java之读写分离实现

  • 需求说明
  • 解决方案
  • Sharding-JDBC
    • 实现步骤
      • MySQL主从复制环境搭建
      • 数据库创建
      • Maven项目搭建
      • 数据源配置
      • 测试样例
    • 总结
      • 存在问题
  • 参考地址

需求说明

  • 读写分离

    数据库做读写分离,一主多从

解决方案

  • 应用层解决

  • 中间件解决

    Sharding-JDBC

Sharding-JDBC

  • 官网地址

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

  • 简介

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

  • 特性

    1. 适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC

    2. 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

    3. 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

  • 调用流程

  • 其他

    ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

实现步骤

MySQL主从复制环境搭建

  • 参考链接

    https://blog.csdn.net/weixin_42586723/article/details/107752844

数据库创建

  • SQL语句

    分别在主从环境创建数据库mbank ,并在主节点mbank库中创建一个user表(此时会在从节点mbank库中自动创建user表),用于数据操作演示

       CREATE DATABASE IF NOT EXISTS mbank DEFAULT CHARSET utf8 COLLATE utf8_general_ci;USE mbank;DROP TABLE IF EXISTS `user`;CREATE TABLE `user`(id bigint(64) not null,city varchar(20) not null,name varchar(20) not null,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Maven项目搭建

  • 模块名称
    sjdbc-read-write-springboot

  • pom依赖

    <!-- Sharding-JDBC --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency>

数据源配置

  • application配置

    server.port=8084mybatis.config-location=classpath:META-INF/mybatis-config.xml# 数据源名称集合,对应下面数据源配置的名称spring.shardingsphere.datasource.names=master,slave# 主数据源spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.master.url=jdbc:mysql://192.168.159.134:3306/mbank?characterEncoding=utf-8spring.shardingsphere.datasource.master.username=rootspring.shardingsphere.datasource.master.password=1q2w3e4r# 从数据源spring.shardingsphere.datasource.slave.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.slave.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.slave.url=jdbc:mysql://192.168.159.133:3306/mbank?characterEncoding=utf-8spring.shardingsphere.datasource.slave.username=rootspring.shardingsphere.datasource.slave.password=123456# 读写分离配置 load-balance-algorithm-type用于配置从库负载均衡算法类型,可选值:ROUND_ROBIN(轮询),RANDOM(随机)spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin# 最终的数据源名称spring.shardingsphere.masterslave.name=dataSource# 主库数据源名称spring.shardingsphere.masterslave.master-data-source-name=master# 从库数据源名称列表,多个逗号分割spring.shardingsphere.masterslave.slave-data-source-names=slave# 显示SQLspring.shardingsphere.props.sql.show=true

测试样例

  • 测试请求

    1. 发送请求
    # 请求新增http://localhost:8084/add# 查询列表http://localhost:8084/users
    1. 查看数据库
    -- 从库中执行发现已自动新增数据select * from user;-- 在从库中执行新增脚本,并测试查询列表请求,发现存在刚通过脚本新增的数据

总结

存在问题

  • 读延迟问题

    问题阐述

    系统刚插入一条数据,无法立即读取。因为主节点写入完之后数据是要复制给从节点的,读不到的原因是复制的时间比较长,也就是说数据还没复制到从节点,这时无法读取

    解决方案

    mysql5.7 的主从复制是多线程了,意味着速度会变快,但是不一定能保证百分百马上读取到

    1. 强制走主库查询
    若业务层要求必须实时读取,那么可以通过Sharding-JDBC配置强制走主库进行读取```javapublic List<User> list() { // 强制路由主库 HintManager.getInstance().setMasterRouteOnly(); return userRepository.list(); }```
    
  • 数据同步

    测试代码样例中并不涉及Mysql数据库之间复制,需要另外搭建主从复制的数据库。

参考地址

  • 项目源码地址

    https://github.com/yinjihuan/sharding-jdbc

  • 在IDEA里导入从Github上下载的Maven项目

    https://blog.csdn.net/sikefeng/article/details/80044693

  • Sharding-JDBC:查询量大如何优化

    https://www.cnblogs.com/yinjihuan/p/10965595.html

  • java读写分离的实现

    https://www.cnblogs.com/ngy0217/p/8987508.html

    https://www.cnblogs.com/ningwuyu/p/12091855.html

  • MySQL主从复制

    https://www.jianshu.com/p/19cb0f16dea4

Java之读写分离实现相关推荐

  1. java读取mysql配置文件_一文读懂 MySQL 主从复制读写分离

    文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 前言 在很多项目,特别是互联网项目,在使用MySQL时都会采用主从复 ...

  2. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置

    java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 发布于 2020-4-4| 复制链接 分享一篇关于关于mysql+spring+mybatis实现数据库读写分离的代 ...

  3. java读取mysql配置文件_Linux运维:MySQL读写分离解决方案

    一次性付费进群,长期免费索取教程,没有付费教程. 进微信群回复公众号:微信群:QQ群:460500587  教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍  微信公众号:计算机与网络安全 I ...

  4. mysql读写分离java配置方法_springboot配置数据库读写分离

    为什么要做数据库读写分离 大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用 ...

  5. mybatis 配置多数据源 java,SpringBoot+MyBatisPlus配置多数据源读写分离

    首先呢,我们这里使用MySQL的数据库,可以简单配置一下主从备份来实现两个数据库的数据同步 项目的配置目录大概是这样的作为参考 第一步.定义一个枚举类声明当前的数据源类型 package com.yu ...

  6. sqlserver AlwaysOn实现读写分离配置及java/net代码实现

    1.用读写分离的原因: O.读写量很大,为了提升数据库读写性能,将读写进行分离: O.如果多机房下写少读多,同时基于数据一致性考虑,只有一个主库存入所有的数据写入,本地再做从库提供读取,减少多机房间直 ...

  7. java mongo replica_mongo 的replica set的集群模式 实现读写分离

    对于replica set 中的secondary 节点默认是不可读的.在写多读少的应用中,使用Replica Sets来实现读写分离.通过在连接时指定或者在主库指定slaveOk,由Secondar ...

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

    目录 1.介绍 2.ShardingJDBC 3.入门案例 4.测试 4.1 增加 4.2 删除 4.3 修改 4.4 查询 1.介绍 面对日益增加的系统访问量,数据库的吞吐量面临着巨大的瓶颈,可能有 ...

  9. Java实现数据库读写分离

    java读写分离的实现 1.  背景 我们一般应用对数据库而言都是"读多写少",也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入 ...

最新文章

  1. C#中try catch中throw ex和throw方式抛出异常有何不同
  2. python写一个通讯录V2.0
  3. Day28:Event对象、队列、multiprocessing模块
  4. VTK:IO之3DSImporter
  5. 迈克尔逊干涉仪的调整与使用实验报告
  6. 一部分 数据 迁移_从虚机到容器,知名架构师告诉你如何平滑进行业务迁移
  7. Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)
  8. mysql用大白话解释_大白话 golang 教程-22-关系型数据库访问
  9. 孩子学习缺乏主动性,应该怎么做?
  10. linux下进程号,Linux下C++获取进程号
  11. html5在线拍照,h5调用html5拍照上传功能
  12. 解决360抢票王刷票0.1秒停顿问题,思考抢票软件和IT行业
  13. NLPCC'22 | 一种兼具准确性和多样性的图像风格化描述生成框架
  14. 面试过程中如何回答面试官的问题,才能让你顺利拿到Offer?冰河想以经典的事务问题对你说这些!!(建议收藏)
  15. Sqli-labs之Less-17
  16. 红帽子linux网络播放器,redhat默认播放器(totem)解码包安装
  17. Mac平台工具介绍-视频播放器篇
  18. SUSAN边缘检测算法,及其Matlab和OpenCV实现
  19. 实习半年以来的感受和收获
  20. 22年12月日常实习总结

热门文章

  1. 赚下跌的钱!基金定投也能成千万富翁
  2. 当代教育实践与教学研究杂志社当代教育实践与教学研究编辑部2022年第24期目录
  3. Day1、为什么JDK1.8中HashMap从头插入改成尾插入
  4. 设计一个形状类(接口)Shape
  5. 芯片制造过程3洁净室
  6. 线性回归模型的性能评价指标
  7. 构建推荐系统:用 Netflix 电影评价数据集练练手
  8. VMware中安装Windows Server 2008 R2系统
  9. 网站管理助手4.0 mysql_网站管理助手v4.0 建站流程
  10. Linux Kernel 6.0 CXL Core Regs.c 详解