Java之读写分离实现
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框架
特性
适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
支持任意实现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-springbootpom依赖
<!-- 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
测试样例
测试请求
- 发送请求
# 请求新增http://localhost:8084/add# 查询列表http://localhost:8084/users
- 查看数据库
-- 从库中执行发现已自动新增数据select * from user;-- 在从库中执行新增脚本,并测试查询列表请求,发现存在刚通过脚本新增的数据
总结
存在问题
读延迟问题
问题阐述
系统刚插入一条数据,无法立即读取。因为主节点写入完之后数据是要复制给从节点的,读不到的原因是复制的时间比较长,也就是说数据还没复制到从节点,这时无法读取
解决方案
mysql5.7 的主从复制是多线程了,意味着速度会变快,但是不一定能保证百分百马上读取到
- 强制走主库查询
若业务层要求必须实时读取,那么可以通过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之读写分离实现相关推荐
- java读取mysql配置文件_一文读懂 MySQL 主从复制读写分离
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 前言 在很多项目,特别是互联网项目,在使用MySQL时都会采用主从复 ...
- java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置
java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 发布于 2020-4-4| 复制链接 分享一篇关于关于mysql+spring+mybatis实现数据库读写分离的代 ...
- java读取mysql配置文件_Linux运维:MySQL读写分离解决方案
一次性付费进群,长期免费索取教程,没有付费教程. 进微信群回复公众号:微信群:QQ群:460500587 教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍 微信公众号:计算机与网络安全 I ...
- mysql读写分离java配置方法_springboot配置数据库读写分离
为什么要做数据库读写分离 大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用 ...
- mybatis 配置多数据源 java,SpringBoot+MyBatisPlus配置多数据源读写分离
首先呢,我们这里使用MySQL的数据库,可以简单配置一下主从备份来实现两个数据库的数据同步 项目的配置目录大概是这样的作为参考 第一步.定义一个枚举类声明当前的数据源类型 package com.yu ...
- sqlserver AlwaysOn实现读写分离配置及java/net代码实现
1.用读写分离的原因: O.读写量很大,为了提升数据库读写性能,将读写进行分离: O.如果多机房下写少读多,同时基于数据一致性考虑,只有一个主库存入所有的数据写入,本地再做从库提供读取,减少多机房间直 ...
- java mongo replica_mongo 的replica set的集群模式 实现读写分离
对于replica set 中的secondary 节点默认是不可读的.在写多读少的应用中,使用Replica Sets来实现读写分离.通过在连接时指定或者在主库指定slaveOk,由Secondar ...
- Java 实现数据库读写分离竟如此简单?
目录 1.介绍 2.ShardingJDBC 3.入门案例 4.测试 4.1 增加 4.2 删除 4.3 修改 4.4 查询 1.介绍 面对日益增加的系统访问量,数据库的吞吐量面临着巨大的瓶颈,可能有 ...
- Java实现数据库读写分离
java读写分离的实现 1. 背景 我们一般应用对数据库而言都是"读多写少",也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入 ...
最新文章
- C#中try catch中throw ex和throw方式抛出异常有何不同
- python写一个通讯录V2.0
- Day28:Event对象、队列、multiprocessing模块
- VTK:IO之3DSImporter
- 迈克尔逊干涉仪的调整与使用实验报告
- 一部分 数据 迁移_从虚机到容器,知名架构师告诉你如何平滑进行业务迁移
- Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)
- mysql用大白话解释_大白话 golang 教程-22-关系型数据库访问
- 孩子学习缺乏主动性,应该怎么做?
- linux下进程号,Linux下C++获取进程号
- html5在线拍照,h5调用html5拍照上传功能
- 解决360抢票王刷票0.1秒停顿问题,思考抢票软件和IT行业
- NLPCC'22 | 一种兼具准确性和多样性的图像风格化描述生成框架
- 面试过程中如何回答面试官的问题,才能让你顺利拿到Offer?冰河想以经典的事务问题对你说这些!!(建议收藏)
- Sqli-labs之Less-17
- 红帽子linux网络播放器,redhat默认播放器(totem)解码包安装
- Mac平台工具介绍-视频播放器篇
- SUSAN边缘检测算法,及其Matlab和OpenCV实现
- 实习半年以来的感受和收获
- 22年12月日常实习总结
热门文章
- 赚下跌的钱!基金定投也能成千万富翁
- 当代教育实践与教学研究杂志社当代教育实践与教学研究编辑部2022年第24期目录
- Day1、为什么JDK1.8中HashMap从头插入改成尾插入
- 设计一个形状类(接口)Shape
- 芯片制造过程3洁净室
- 线性回归模型的性能评价指标
- 构建推荐系统:用 Netflix 电影评价数据集练练手
- VMware中安装Windows Server 2008 R2系统
- 网站管理助手4.0 mysql_网站管理助手v4.0 建站流程
- Linux Kernel 6.0 CXL Core Regs.c 详解