Mock服务设计与实现:MySQL驱动字节码修改增强
摘要:华为导流测试平台通过对线上流量回放到被测环境中,利用线上真实流量进行充分测试,保证业务系统稳定上线。但是业务在导流测试过程中现网数据库往往难以同步到测试环境,导致现网数据无法正常回放,测试价值降低。由此提出回放过程中对数据库进行mock,以保证回放过程正常进行。
一、需求分析
1.背景
华为导流测试平台通过对线上流量回放到被测环境中,利用线上真实流量进行充分测试,保证业务系统稳定上线。但是业务在导流测试过程中现网数据库往往难以同步到测试环境,导致现网数据无法正常回放,测试价值降低。由此提出回放过程中对数据库进行mock,以保证回放过程正常进行。
2.方案分析
数据库Mock方案大致分为以下3种:

3.方案对比


二、方案2:MySQL驱动字节码修改增强方案详细说明
1.方案设计
字节码增强:通过分析MySQL数据库驱动源码可知,获取数据库返回的ResultSet结果集的方法在com.mysql.jdbc.PreparedStatement类中的executeQuery方法,和执行完execute方法之后再调用getResultSet方法两种方式,所以我们需要对executeQuery和execute两个方法进行字节码修改增强。即在这两个方法执行完成之后,注入以下代码:获取Mock文件中的行列数据,转成MySQL需要的字节码对象,再设置到ResultSet实例化对象中替换原数据库的真实数据即可。

Mock数据设计和解析:一次请求链路中,比如有下面三次查询语句,并且存在相同sql执行多次并且返回结果不同的情况,那么我们在回放请求过程时,就得按顺序去依次取得每条sql执行的结果数据,而且能做到可对链路中其中一些sql结果进行mock,不mock的sql返回数据库的真实数据。

2.使用说明
1.在需要数据库Mock功能的第三方服务的启动命令中增加-javaagent参数指向该jar包,方式如下:
java -javaagent:D:/dbmockagent.jar -jar **.jar
2.参数设置:
(1)可设置dbmock.file参数指定Mock数据文件,不设置时默认为C:/dbmock.data。目前只实现了从文件中读取mock数据,可扩展从接口等其它地方获取Mock数据。
java -javaagent:D:/dbmockagent.jar -Ddbmock.file="D:/dbmock.data" –jar **.jar
(2)可设置dbmock.port参数指定重载Mock数据接口调用的端口,可不设置,默认为8888:
java -javaagent:D:/dbmockagent.jar -Ddbmock.file="D:/dbmock.data" -Ddbmock.port=8088 -jar **.jar
3.方案测试
3.1 使用MySQL驱动直连数据库

3.1.1 不使用插件

3.1.2 使用插件

再次运行上面的代码,执行结果如下,输出了DBMock相关的log信息,返回的数据正好为上面mock的数据,并且两次sql语句虽然相同,但是返回的结果数据是按照mock文件里的顺序返回的。

3.2 SpringBoot工程中通过MyBatis连接数据库


3.2.1 不使用插件


3.2.2 使用插件


3.3 Mock数据更新



本文分享自华为云社区《数据库Mock方案设计》,原文作者:chenhuaping 。
Mock服务设计与实现:MySQL驱动字节码修改增强的更多相关文章
- window java 字节码修改
前提: win10 安装包: 1. JDK10.0.1.msi (包含jre环境), JDK的安装路径 2. jclasslib 6.0.3 用于编辑常量 3.JBE 用于编辑 ...
- qt mysql驱动问题解绝
传统解决方法:一.解决问题 本文解决在Ubuntu16.04系统下,Qt5无法连接MySQL数据库的问题(Qt5缺少MySQL驱动,Qt5缺少libqsqlmysql.so动态库,如何安装libqsq ...
- centos 下Qt安装 mysql驱动(亲测可行)
(前半部分没有试过,因为我的有mysql驱动,实在抱歉) 1.预防万一,先安装一下mysql-devel(一定要装!). 不安装的话后面编译会出现找不到-lmysqlclient的问题. 2. 开始编 ...
- 《深入理解Java虚拟机》-----第8章 虚拟机字节码执行引擎——Java高级开发必须懂的
概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念 ,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而 ...
- Java字节码(.class文件)格式详解(一)
原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...
- Java 动态字节码技术
对 Debug 的好奇 初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些 ...
- 大话+图说:Java字节码指令——只为让你懂
前言 随着Java开发技术不断被推到新的高度,对于Java程序员来讲越来越需要具备对更深入的基础性技术的理解,比如Java字节码指令.不然,可能很难深入理解一些时下的新框架.新技术,盲目一味追新也会越 ...
- Java之字节码(2) - .class文件格式详解
转载来自 小介:去 年在读<深入解析JVM>的时候写的,记得当时还想着用自己的代码解析字节码的,最后只完成了一部分.现在都不知道还有没有保留着,貌似Apache有现 成的BCEL工程可以做 ...
- 深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- AutoRegister ASM AOP 字节码 案例 原理 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 可视化-vscode安装pandas
pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.pandas提供了大量能使我们快速 ...
- 产品代码都给你看了,可别再说不会DDD(七):实体与值对象
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- 多线程指南:探究多线程在Node.js中的广泛应用
前言 最初,JavaScript是用于设计执行简单的web任务的,比如表单验证.直到2009年,Node.js的创建者Ryan Dahl让开发人员认识到了通过JavaScript 进行后端开发已成为可 ...
- QAction常用接口总结
目录 public (一)构造函数 (二)setShortcut (三)setStatusTip Signals (一)trigger() public (一)构造函数 1.QAction(const ...
- SNN_文献阅读_Text Classification in Memristor-based Spiking Neural Networks
SNN中局部学习和非局部学习,基于梯度的规则都需要对用于表示单个连续值的脉冲训练窗口上的累积误差进行平均,这种方法在更新权重时考虑了每一个脉冲的影响.在计算速度和空间效率等方面,特别是当代表单个数值的 ...
- 【NOI2014】 魔法森林---解题报告
传送门 题目大意 给定 \(n\) 个点和 \(m\) 条边.每条边包含起点终点和两个精灵的最低限制,求最少需要携带的精灵数量. 题目解析 直接套 LCT 板子 将所有边按照进行升序排序,从小到大将边 ...
- Android 应用接入 Firebase Crashlytics 进行崩溃分析上报
前言 所在公司的项目中有一款应用应客户要求,需要接入 Firebase Crashlytics,在此提前练手,也做个总结.本文以最新的 Gradle 7.5 为例,如果 Gradle 版本比较低,添加 ...
- 为什么 Django 后台管理系统那么“丑”?
哈喽大家好,我是咸鱼 相信使用过 Django 的小伙伴都知道 Django 有一个默认的后台管理系统--Django Admin 它的 UI 很多年都没有发生过变化,现在看来显得有些"过时 ...
- 想基于AI变现吗,这个Star有1.8K的开源项目分享给你
前言 在如今AI爆发的时代,每个人都想借着AI这股风,进行变现,今天给大家分享一个开源项目,他可以让你基于AI的能力进行变现 项目介绍 这个项目在Github有1.8k个star,可见其欢迎程度,作者 ...
- .NET领域性能最好的对象映射框架Mapster使用方法
Mapster是一个开源的.NET对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射.在本文中,我将详细介绍如何在.NET中使用Mapster,并提供一些实例和源代码. 和其它框架性能对比: ...