当前位置: 首页 > news >正文

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录

    • 1 前言
    • 2、创建SpringBoot程序
      • 2.1、创建项目
      • 2.2、添加依赖
      • 2.3、生成实体类、service与Mapper
      • 1.5、配置读写分离
    • 2、测试
      • 2.1、读写分离测试
      • 2.2、事务测试
      • 2.3、负载均衡测试
    • 结语

1 前言

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

在这里插入图片描述

关于mysql配置主从复制,可以参考之前写的文章=0101docker mysql8镜像主从复制-运维-mysql=

2、创建SpringBoot程序

2.1、创建项目

项目类型:Spring Initializr

SpringBoot脚手架:http://start.aliyun.com

项目名:sharding-jdbc-demo

SpringBoot版本:2.7.10

2.2、添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gaogzhen</groupId><artifactId>sharging-jdbc-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>sharging-jdbc-demo</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath /></parent><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.7.10</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.1.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.gaogzhen.shardingjdbcdemo.ShardingJdbcDemoApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

2.3、生成实体类、service与Mapper

使用idea插件mybatisX,根据数据库连接表生成实体类、service、mapper

第一步:如下图2.3-1所示

在这里插入图片描述

第二步:如下图2.3-2所示:

在这里插入图片描述

  • 实体类
package com.gaogzhen.shardingjdbcdemo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;/*** 用户* @author gaogzhen* @TableName t_user*/
@TableName(value ="t_user")
@Data
public class User implements Serializable {@TableField(exist = false)private static final long serialVersionUID = 1L;@TableId(type = IdType.AUTO)private Long id;/*** 用户名*/private String name;}
  • service
package com.gaogzhen.shardingjdbcdemo.service;import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;/**
* @author gaogzhen
* @description 针对表【t_user】的数据库操作Service
* @createDate 2023-08-13 15:37:14
*/
public interface UserService extends IService<User> {}
  • serviceImpl
package com.gaogzhen.shardingjdbcdemo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.gaogzhen.shardingjdbcdemo.service.UserService;
import com.gaogzhen.shardingjdbcdemo.mapper.UserMapper;
import org.springframework.stereotype.Service;/**
* @author gaogzhen
* @description 针对表【t_user】的数据库操作Service实现
* @createDate 2023-08-13 15:37:14
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService{}
  • mapper
package com.gaogzhen.shardingjdbcdemo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gaogzhen.shardingjdbcdemo.entity.User;
import org.apache.ibatis.annotations.Mapper;/**
* @author gaogzhen
* @description 针对表【t_user】的数据库操作Mapper
* @createDate 2023-08-13 15:37:14
* @Entity com.gaogzhen.shardingjdbcdemo.entity.User
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {}

1.5、配置读写分离

application.properties:

# 应用名称
spring.application.name=sharging-jdbc-demo
# 开发环境设置
spring.profiles.active=dev
# 内存模式
spring.shardingsphere.mode.type=Memory# 配置真实数据源
spring.shardingsphere.datasource.names=master,slave1,slave2# 配置第 1 个数据源
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://127.0.0.1:3340/db_user?allowPublicKeyRetrieval=true&useSSL=false
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456# 配置第 2 个数据源
spring.shardingsphere.datasource.slave1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.jdbc-url=jdbc:mysql://127.0.0.1:3341/db_user?allowPublicKeyRetrieval=true&useSSL=false
spring.shardingsphere.datasource.slave1.username=root
spring.shardingsphere.datasource.slave1.password=123456# 配置第 3 个数据源
spring.shardingsphere.datasource.slave2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave2.jdbc-url=jdbc:mysql://127.0.0.1:3342/db_user?allowPublicKeyRetrieval=true&useSSL=false
spring.shardingsphere.datasource.slave2.username=root
spring.shardingsphere.datasource.slave2.password=123456# 读写分离类型,如: Static,Dynamic
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static
# 写数据源名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=master
# 读数据源名称,多个从数据源用逗号分隔
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=slave1,slave2# 负载均衡算法名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-name=alg_round# 负载均衡算法配置
# 负载均衡算法类型
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_round.type=ROUND_ROBIN
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_random.type=RANDOM
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.type=WEIGHT
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave1=1
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave2=2# 打印SQl
spring.shardingsphere.props.sql-show=true# mybatis plus 配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.gaogzhen.shardingjdbcdemo.entity
  • myds为自定义的逻辑数据源名称
  • 当前生效的负载均衡算法为轮询,可以通过更换负载均衡算法名称,来测试随机和权重。

2、测试

2.1、读写分离测试

package com.gaogzhen.shardingjdbcdemo;import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.gaogzhen.shardingjdbcdemo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.List;@SpringBootTest
public class ReadWriteTest {@Resourceprivate UserMapper userMapper;/*** 读写分离:写入数据的测试*/@Testpublic void testInsert(){User user = new User();user.setName("张三");userMapper.insert(user);User user1 = userMapper.selectById(1L);}}

2.2、事务测试

为了保证主从库间的事务一致性,避免跨服务的分布式事务,ShardingSphere-JDBC的主从模型中,事务中的数据读写均用主库

  • 不添加@Transactional:insert对主库操作,select对从库操作
  • 添加@Transactional:则insert和select均对主库操作
  • **注意:**在JUnit环境下的@Transactional注解,默认情况下就会对事务进行回滚(即使在没加注解@Rollback,也会对事务回滚)
 /*** 事务测试*/@Transactional@Testpublic void testTrans() {User user = new User();user.setName("xxx001");userMapper.insert(user);List<User> users = userMapper.selectList(null);}

2.3、负载均衡测试

/*** 负载均衡测试*/
@Test
public void testLoadBalance() {List<User> users1 = userMapper.selectList(null);List<User> users2 = userMapper.selectList(null);}

也可以在web请求中测试负载均衡

package com.gaogzhen.shardingjdbcdemo.controller;import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.gaogzhen.shardingjdbcdemo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;/*** 测试负载均衡策略*/@GetMapping("selectAll")public void selectAll(){List<User> users = userService.list();users.forEach(System.out::println);}
}

命令行测试结果如下图所示:

在这里插入图片描述

结语

如果小伙伴什么问题或者指教,欢迎交流。

QQ:806797785

仓库源代码地址:https://github.com/gaogzhen/shardingsphere-jdbc-demo.git

参考链接:

[1]ShardingSphere5实战教程[CP/OL].2022-09-14.p18-23.

[2]mysql官网使用配置文件文档[CP/OL].

相关文章:

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的…...

sqlite3将词典导入数据库

使用sqlite3代码实现将词典导入数据库中 #include <head.h> #include <sqlite3.h> #include <strings.h> #include <unistd.h> int main(int argc, const char *argv[]) {sqlite3 *db NULL;if(sqlite3_open("./dict.db",&db) ! SQLITE…...

浏览器 - 事件循环机制详解

目录 1&#xff0c;浏览器进程模型进程线程浏览器的进程和线程1&#xff0c;浏览器进程2&#xff0c;网络进程3&#xff0c;渲染进程 2&#xff0c;渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3&#xff0c;常见面试题1&#xff0c;如何理解 js 的异步2&#x…...

析构函数中不应该抛出异常(摘录)

析构函数中抛出异常时概括性总结 从语法上面讲&#xff0c;析构函数抛出异常是可以的&#xff0c;C并没有禁止析构函数引发异常&#xff0c;但是C不推荐这一做法&#xff0c;从析构函数中抛出异常是及其危险的。 如果析构函数抛出异常&#xff0c;则异常点之后的程序不会执行&a…...

Windows定时任务计划无法显示任务程序界面的问题解决

笔者这两天写了一个python脚本程序&#xff0c;用来自动从公司的主数据系统获取数据&#xff0c;并按格式编制成excel。脚本程序编写一切顺利&#xff0c;运行结果很是完美&#xff0c;笔者很是舒心。但在最后一步&#xff0c;用上班的电脑每天早上定时运行它时&#xff0c;出了…...

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

问题描述 使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制&#xff0c;如被限制的IP地址一分钟可以访问10次&#xff0c;而不被限制的IP地址则可以无限访问&#xff1f; ChatGPT 解答 最近ChatGPT爆火&#xff0c;所以也把这个问题让ChatGPT来解答&#x…...

Python学习笔记_进阶篇(二)_django知识(一)

本章简介&#xff1a; Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MVC的软件设计模式&#xff0c;即模型M&#xff0c;视图V和控制器C。它最初是被开发来…...

【hive】hive中row_number() rank() dense_rank()的用法

hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的&#xff0c;通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序&#xff0c;有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …...

【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署

目录 EFK安装部署 一、环境准备&#xff08;所有主机&#xff09; 1、主机初始化配置 2、配置主机名并绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、配置阿里云yum源 3、安装kubelet kubeadm …...

计算实数数组中所有元素的绝对值 numpy.fabs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算实数数组中所有元素的绝对值 numpy.fabs() [太阳]选择题 请问关于以下代码表述错误的是&#xff1f; iimport numpy as np a np.array([-1,-3]) b np.array([-1,34j]) print("【显…...

深入浅出Pytorch函数——torch.nn.init.orthogonal_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

ORACLE中UNION、UNION ALL、MINUS、INTERSECT学习

1、UNION和UNION ALL的使用与区别 如果我们需要将两个select语句的结果作为一个整体显示出来&#xff0c;我们就需要用到union或者union all关键字。union的作用是将多个结果合并在一起显示出来。 union和union all的区别是union会自动压缩多个结果集合中的重复结果&#xff…...

【k8s、云原生】基于metrics-server弹性伸缩

第四阶段 时 间&#xff1a;2023年8月18日 参加人&#xff1a;全班人员 内 容&#xff1a; 基于metrics-server弹性伸缩 目录 一、Kubernetes部署方式 &#xff08;一&#xff09;minikube &#xff08;二&#xff09;二进制包 &#xff08;三&#xff09;Kubeadm 二…...

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程…...

VSCode快捷键

CtrlShiftP&#xff0c;F1&#xff1a;显示命令面板 CtrlP&#xff1a;快速打开 CtrlShiftN&#xff1a;新窗口/实例 CtrlShiftW&#xff1a;关闭窗口/实例 CtrlX&#xff1a;剪切行 CtrlC&#xff1a;复制行 ALT↑/↓&#xff1a;上下移动 ShiftAlt↓/↑&#xff1a;向…...

贪心算法求数组中能组成三角形的最大周长

题目&#xff1a;三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形&#xff0c;返回0。 分析&#xff1a; 对数组排序&#xff0c;再从大到小选择三个数&#xff0c;再…...

VMWare Workstation 17 Pro 网络设置 桥接模式 网络地址转换(NAT)模式 仅主机模式

文章目录 网络模式配网要求CentOSDHCP虚拟网络桥接模式默认配置测试手动配置测试 网络地址转发模式 (NAT)还原配置虚拟网络配置默认配置测试手动配置测试 仅主机模式 网络模式 桥接模式: 主机与虚拟机对等, 虚拟机注册到主机所在的局域网, 会占用该网络的IP该局域网内的所有机…...

拒绝摆烂!C语言练习打卡第四天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…...

KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.08.04-2023.…...

【学习笔记之java】使用RestTemplate调用第三方接口

1.首先需要导入依赖 <!-- RestTemplate使用导入的依赖--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>2.跟启动类同级创建…...

FLUX.1-dev镜像免配置部署:5分钟启动影院级Text-to-Image服务

FLUX.1-dev镜像免配置部署&#xff1a;5分钟启动影院级Text-to-Image服务 想体验一下“所见即所得”的顶级AI绘画吗&#xff1f;今天&#xff0c;我们一起来部署一个开箱即用的FLUX.1-dev旗舰版镜像。它集成了当前开源界最强的文本生成图像模型之一&#xff0c;并且针对24GB显…...

实战演练:基于快马平台快速开发一个可动态切换主题色的网站Demo

今天想和大家分享一个非常实用的前端小项目——如何快速开发一个能动态切换主题色的网站Demo。这个功能在实际项目中特别常见&#xff0c;比如我们常见的深色模式切换、企业官网的主题定制等。下面我就用InsCode(快马)平台来演示整个实现过程。 项目结构设计 首先我们需要规划…...

收藏!小白程序员必备:从零入门大模型,抢占职场新风口(含学习资源包)

收藏&#xff01;小白程序员必备&#xff1a;从零入门大模型&#xff0c;抢占职场新风口&#xff08;含学习资源包&#xff09; CB Insights报告显示&#xff0c;AI智能体市场正爆发式增长&#xff0c;2024年融资达38亿美元。市场分为基础设施、通用应用和垂直应用三大板块&…...

Turbo实战:如何用任务编排优化你的Monorepo构建流程?以pnpm+vitepress为例

Turbo实战&#xff1a;如何用任务编排优化你的Monorepo构建流程&#xff1f;以pnpmvitepress为例 在当今前端工程化领域&#xff0c;Monorepo已成为管理复杂项目的标配方案。但当项目规模增长到一定程度时&#xff0c;传统的构建方式往往会面临效率瓶颈——每次全量构建耗时漫长…...

PyTorch 2.5快速部署指南:3步开启你的AI模型训练之旅

PyTorch 2.5快速部署指南&#xff1a;3步开启你的AI模型训练之旅 1. PyTorch 2.5环境准备 PyTorch 2.5作为当前最流行的深度学习框架之一&#xff0c;带来了多项性能优化和新特性。在开始之前&#xff0c;我们需要确保环境配置正确。 1.1 系统要求检查 操作系统&#xff1a…...

PDF-Parser-1.0一键部署教程:5分钟搞定文档解析神器,小白也能轻松上手

PDF-Parser-1.0一键部署教程&#xff1a;5分钟搞定文档解析神器&#xff0c;小白也能轻松上手 1. 为什么你需要这个文档解析工具&#xff1f; 你是不是经常遇到这样的烦恼&#xff1f; 下载了一份重要的PDF报告&#xff0c;想把里面的表格数据整理到Excel里&#xff0c;结果…...

Z-Image i2L模型压缩技术:轻量化部署实践指南

Z-Image i2L模型压缩技术&#xff1a;轻量化部署实践指南 1. 引言 当你兴奋地部署了一个强大的图像生成模型&#xff0c;却发现设备内存告急、推理速度慢如蜗牛&#xff0c;这种体验确实让人沮丧。Z-Image i2L作为一款创新的图像到LoRA模型&#xff0c;虽然功能强大&#xff…...

【部署】windows下虚拟机OpenClaw Ubuntu 24.04.4 安装指南

未来已来,只需一句指令,养龙虾专栏导航,持续更新ing… 概述 前置环境:win10/11、vmware等虚拟机(安装时注意勾选VMware Tools、cpu可以分配2C,内存建议4G,硬盘空间建议给40G) 系统要求 Node.js 22+:安装脚本可自动检测并安装(下文补充手动安装方案); Ubuntu 24.0…...

vLLM-v0.17.1效果展示:vLLM支持MoE模型(如Mixtral)推理实测

vLLM-v0.17.1效果展示&#xff1a;vLLM支持MoE模型&#xff08;如Mixtral&#xff09;推理实测 1. vLLM框架核心能力 vLLM是一个专注于大语言模型推理的高性能服务库&#xff0c;最新发布的v0.17.1版本带来了对MoE&#xff08;混合专家&#xff09;架构模型的全面支持。这个最…...

05-OpenClaw 自动生成 PPT 实战:每天节省 3 小时

作者&#xff1a;程序员小明儿 字数&#xff1a;约 9000 字 阅读时间&#xff1a;约 25 分钟 难度&#xff1a;⭐⭐⭐ 中级 系列&#xff1a;OpenClaw 实战 16 例&#xff08;第 5 篇&#xff09; 前置条件&#xff1a;已完成 OpenClaw 环境部署和基础配置写在前面 你是不是也这…...