【转】使用JMeter对数据库做压力测试

作为一名开发人员,大多情况下都会认真的做好功能测试,但是却常常忽略了软件开发之后的压力测试,尤其是在面向大量用户同时使用的Web应用系统的开发过程,压力测试往往是不够充分的。近期我在一个求职招聘型的网站项目中就对压力测试的重要性体会颇深。

  在项目中,我负责开发职位信息的搜索部分,但是由于缺乏压力测试,仓促将搜素部分的功能提交到生产环境,结果当并发量稍稍到达一定程度时,数据库系统便已经不堪重负。无奈之下向网上资源查询解决方法,其中一个就是对现有的应用做足够到位的压力测试。

  压力测试有着很丰富的内容,而这里,我只针对应用中所遇到的问题以及解决方法做一个简单的描述,希望对以后遇到同样问题的朋友能够起到些许帮助作用。

  我自己做的例子使用的环境是:

  测试工具:JMeter 2.3.1

  数据库:Oracle 10G

  其他环境:JDK 1.6.0_05(也可以使用JDK1.4及以上版本)

  1.创建好的JMeter测试计划树形结构图如下:

  2.在刚打开JMeter的时候,默认会存在两个节点,一个是“Test Plan”,点击这个节点,在右边的属性页面中,命名为“我们的数据库测试计划”

  在属性页的最下面,我们看到设置jar包所在路径的选项,默认存在一个选项"E:\software\develop\testunit\jMeter \jakarta-jmeter-2.3.1\lib",这个是我的机器中JMeter的lib目录,在这个例子中,Oracle的jdbc驱动也已经拷贝到该目录下。

3.新增一个“Thread Group”,重命名为“使用变化的SQL来做数据库压力测试”。其中,“Number of Threads”表示的是JMeter会同时创建多少个线程来进行压力测试,对于一个网站而言,也就是模拟一次存在多少个用户来访问该网站;而“Ramp-Up Period(in seconds)”表示JMeter每个多少秒发动并发;“Loop Count”则是指配置好的并发情形发生多少次。

  4.在“Thead Group”下创建一个“User Defined Variables”,即用户自定义变量,重命名为“我们定义的动态语句部分”,这里我们使用它来生成动态SQL语句,让用户每次访问数据库的SQL语句都不一样,这样减少Oracle数据库对相同SQL语句的缓存对测试结果所带来的影响。

  变量定义的完整内容如下:

NameValue
str${__split(D610 or 笔记本|D610 or D620|D620|服务器,keyword,|)}
many_sqlp_name like '%D610%' or p_name like '%AIX%'| p_name like '%笔记本%' or p_name like '%D610%'|p_name like '%D610%'| p_name like '%AIX%'
smt${__split(${many_sql},smt,|)}

  注:${__split(...)} 是JMeter中自带的拆分字符串为数组的函数,可以通过JMeter工具栏"Options"->"Function Helper Dialog"来打开函数代码辅助工具生成我们所需的函数调用。

  另外有个需要注意的问题是:在${__split(...)} 中,如果拆分字符串中的内容包含有符号",",一定得用符号"\"进行转义,否则可能被JMeter误认为是参数分隔符,会导致无法正确生成字符串数组。

5.接下来是配置JDBC连接设置

  6.创建一个具体的JDBC请求

  "Query Type"中选择的是预编译语句;

  SQL语句当中,动态内容的代码行是"and contains(p.p_name,?) > 0",这里的"?"就是预编译语句中的动态参数,在属性页下面的"Parameter Values"和"Parameter types"来指定,由于预编译语句在Java教程已有很多讲解,这里不再赘述。

  注:这里有一个JMeter的函数"__V..."没有提到,将在后面说明另外一个JDBC调用测试的时候进行补充。

 

7.创建三个监听器,可以从三个不同的层面来观察响应结果

  执行一下测试计划,我们来看看三个监听器所返回的结果是怎样的。

  以上是表格方式查看响应结果的情况,可以看到通过表格可以查看某个范围内的响应时间和响应状态是否正常;

  以上三幅截图则是来自树形监听器,树形监听器在几种监听器中应该是最细致的,可以查看响应状态、时间、以及执行的SQL语句,乃至返回的结果均能进行验证。

 

  至于上面的图形监听器,可以宏观的观察SQL语句在压力测试下响应的平滑度,并且有一定的统计信息,能够观察平均响应时间等。

  现在我们来看另外一种方式编写我们的JDBC调用。就是使用JMeter提供的函数动态生成我们所需要不断变化的SQL语句部分。之所以需要这么做是为了方便我们观察执行的SQL语句内容。

  在前面使用预编译的方式,传递动态参数的SQL语句执行的结果,大家已经看到过,在树形监听器中,我们观察到到执行过的SQL语句是:

 

SELECT *
FROM (SELECT tmp.*, ROWNUM rn
FROM (
select p.p_id, p.p_name, c.cmp_name
from test_product p, test_company c
where p.cmp_id = c.cmp_id
and contains(p.p_name, ?) > 0
--and (p.p_name like '%D%' or p.p_name like '%AIX%')
ORDER BY p.p_id desc
) tmp
WHERE 1 = 1 AND ROWNUM <= 100)
WHERE 1 = 1 AND rn >= 1

 

  这样导致我们无法看出参数"?"当中表示的具体值是什么,这对我们在某些情况下确定SQL语句的性能是相当不利的。所以我们这里需要使用JMeter的动态函数特性。

  我们创建第二个"JDBC Request"节点,而后禁用"产品名 全文关键字 JDBC Request",将新创建的"JDBC Request"重命名为"产品名 like JDBC Request",将其中的SQL语句改写为:

 

 

SELECT *
FROM (SELECT tmp.*, ROWNUM rn
FROM (
select p.p_id, p.p_name, c.cmp_name
from test_product p, test_company c
where p.cmp_id = c.cmp_id
AND ( ${__V(smt_${__Random(1,4,rnd)})} )
ORDER BY p.p_id desc
) tmp
WHERE 1 = 1 AND ROWNUM <= 100)
WHERE 1 = 1 AND rn >= 1

 

这里核心的部分就是代码行"AND ${__V(smt_${__Random(1,4,rnd)})} "。"${__Random(1,4,rnd)}"用来生成随机数,取值范围在1到4之间,而"__V(...)"函数帮助我们转义"smt_${__Random(1,4,rnd)}"生成的内容,很类似于JavaScript中的"eval"函数。

  例如"${__Random(1,4,rnd)}"生成随机数为1,则"smt_${__Random(1,4,rnd)}"对应的内容为"smt_1","__V"将获取数组变量"smt"中的第一个元素,于是生成的SQL语句如下:

  这里我们可以清楚的看到所执行的SQL语句。

  后记

  本例中我们使用了JMeter附带的函数"__split"和"__V","__Random"等等,文章对于这些函数的描述可能不够完整,亦可能不够准确,更多详尽的解释,大家可以参考JMeter官方文档。

转载于:https://www.cnblogs.com/blongfree/p/4981345.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孙叫兽进阶之路之Gitlab的使用(图文教程)

简介&#xff1a; GitLab是一个利用 Ruby on Rails 开发的开源应用程序&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。 它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。可以管理团队对仓库的…

PyQt4(使用ui)

1.使用qt designer设计界面&#xff0c;保存为test1.ui&#xff1a; 2.使用pyuic4 test1.ui -o ui.py生成ui代码。 3.程序载入。 import sys import ui from PyQt4 import QtCore, QtGuiclass MyWidget( QtGui.QWidget ):def __init__(self):super(MyWidget, self).__init__() …

孙叫兽进阶之路之源代码配置管理过程(图文教程)

简介:配置管理(Configuration Management,CM)是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。配置管理的目标是记录软件产品的演化过程,确保软件开发者在软件生命周期中各个阶段都能得到精确的产品配置。

video 微信 标签层级过高_什么是微信小程序二级分销系统?如何玩转?

微信二级分销系统是通过帮助企业打造微分销商城&#xff0c;从店铺、商品、会员、分销、营销、数据分析等不同功能模块&#xff0c;让一个微信店铺焕发无限可能。微分销系统基于二级分销&#xff0c;以全员开店&#xff0c;以客推客模式迅速推动销量增长&#xff0c;快速招募微…

docker搭建简单的ctf题目

0x01 docker常用命令 1.拉取镜像。 docker pull [image] 2.查看docker当前镜像。 docker image ls 或 docker images 3.新建一个docker容器&#xff0c;并映射端口号。 docker run -d -p [host port]:[docker port] [image] 4.查看运行中的docker容器。 docker ps -a 5.进入一…

使用爱思助手备份苹果手机数据的方法

背景:前段时间刚给对象买的一个紫色的苹果11,128G的那种,最近发现电池电量忽然就少很多,电池除了点问题,去苹果售后店准备换一个电池,还在保修期,区分一下售后店(回厂修十多天)及专卖店(有备用电池)。今天提前备份一下数据,防止数据丢失,一般内存不大可以使用手机…

cmake 构建路径_新手必备:win10 系统下 VSCode+CMake+Clang+GCC 环境的搭建

打算用C/C把基本的数据结构与算法实现一遍, 为考研做准备, 因为只是想实现算法和数据结构, 就不太想用VisualStudio, 感觉VSCode不错, 遂在网上找了一些教程, 结合自己的需求, 配置一下开发环境。安装软件1、CMakeCMake是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists…

网络安全单兵工具 -- YAKIT

网络安全单兵工具 -- YAKIT 一、下载及安装 1、原作者及下载地址 https://github.com/yaklang/yakit2、双击下载好的exe文件&#xff0c;点击核心引擎安装与升级 3、点击意见更新Yak引擎 4、以管理员启动 5、点击连接引擎 二、使用方法 1、扫描端口/指纹 2、爆破与未授权 3、专…

Apache 降权 禁用php,Windows下的apache降权

0x00 准备与目标 目标&#xff1a;apache服务降权 操作系统&#xff1a; Windows Server 2012 R2 Standard 环境&#xff1a;phpstudy2018 0x01 操作 1.安装启动服务 打开phpstudy2018&#xff0c;其他选项菜单--》服务管理器--》Apache--》安装服务。 运行模式选择系统服务&am…

孙叫兽进阶之路之压力与绩效

前言:如果我们把拉弦比作压力,把箭比作人,把箭的射程比作工作绩效,我们可以看到:压力对促进工作绩效有着一定的积极作用,但压力如果超出了人的承受范围,就会产生消极的影响。 具有挑战性能产生积极性压力最好,记住“今天工作不努力,明天努力找工作”

交叉驰豫的影响因素_深度讲解:膝关节韧带为什么容易断裂?这5点因素影响非常大...

小科普&#xff1a;ACL 膝关节前交叉韧带 PCL后交叉韧带除了了解ACL损伤机制&#xff0c;弄清ACL损伤的风险因素对预防ACL损伤也是至关重要的。ACL损伤的风险因素也包括解剖学因素、生物力学因素、神经肌肉因素。所有的风险因素的确定有助于预防损伤。解剖学风险因素包括关节松…

CNVD-2022-10207:向日葵RCE

一&#xff1a;漏洞摘要 向日葵远程控制是一款面向企业和专业人员的远程pc管理和控制的服务软件。可以在任何有网络的情况下&#xff0c;轻松访问并控制安装了向日葵客户端的远程主机。同时还能实现远程文件传输、远程视频监控等功能&#xff0c;这不仅为用户的使用带来很多便捷…

python 建筑建模_不可错过的python 街道数据爬取和分析神器!

hello 大家好&#xff01;最近遇到一堆关于街道数据分析的问题&#xff0c;又不想去使用百度和高德的API&#xff0c;有的功能还是得付费&#xff0c;为了学习不想掏钱&#xff0c;那么有什么办法么&#xff1f;答&#xff1a; 有&#xff01;必须有&#xff01;今天给大家分享…

我是如何使用git把本地代码上传到CODECHINA上的,值得借鉴

背景&#xff1a;最近开发了一款城市公交查询系统。没有把代码上传到github&#xff0c;传到CODECHINA试试&#xff0c;先占个坑。 首先进入自己的个人主页&#xff0c;没有自己资料信息的先设置一下&#xff0c; codeChina官网&#xff1a;https://codechina.csdn.net/ 上传需…

Vmware中centos7共享文件夹

1.安装vmtools的步骤 1.进入centos 2.点击vm菜单的->install vmware tools 3.centos会出现一个vm的安装包 &#xff0c;xx.tar.gz 4.拷贝到/opt 5.使用解压命令tar&#xff0c;得到一个安装文件 cd /opt //进入到opt目录 tar -zxvf xx.tar.gz //解压缩命令 …

电感发出声音怎么解决_如何解决多层PCB设计时的EMI

解决EMI问题的办法很多&#xff0c;现代的EMI抑制方法包括&#xff1a;利用EMI抑制涂层、选用合适的EMI抑制零配件和EMI仿真设计等。本文从最基本的PCB布板出发&#xff0c;讨论PCB分层堆叠在控制EMI辐射中的作用和设计技巧。电源汇流排在IC的电源引脚附近合理地安置适当容量的…

电子商务网站放大效果的三种常用的实现方式。

预览效果(这里截取静态,有兴趣的可以运行下面的代码): 实现方式1. <!DOCTYPE html> <html> <head><meta charset="UTF-8"><title>电子商务网站放大镜效果1</title><style type="text/css">html, body, div…

CentOS宝塔搭建(超详细)

本文讲述CentOS搭建宝塔全过程&#xff0c;我会手把手的教你哦~ 1、云平台控制台创建及安装CentOS系统。 不管哪个云应该都有这个系统的。 注意事项&#xff1a; &#xff08;1&#xff09;CentOS系统建议7.4、7.6版本&#xff0c;切勿安装8版本&#xff01; &#xff08;2&…

api 定位 微信小程序 精度_小程序的api是什么

微信小程序API(Application Programming Interface)&#xff0c;应用程序编程接口&#xff0c;也是程序员口中常说的接口。其实api并不专属于小程序&#xff0c;任何编程语言或程序形态都有相对应的api。而我们今天谈的小程序api&#xff0c;是微信小程序团队为了方便开发人员制…

前端全栈大佬是如何使用javaScript实现一个焦点图

效果图: 代码如下: <!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title>焦点图</title><style>ul,li{list-style: none;}#outer{width: 400px;height: 300px;position: relative;margin:…