`

使用JMeter做压力测试-对数据库

阅读更多

最早发表时间:2009-04-06

 

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

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

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

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

    测试工具:JMeter 2.3.1
    数据库:Oracle 10G
    其他环境:JDK 1.6.0_05(也可以使用JDK1.4及以上版本)

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

JMeter数据库测试计划_1_创建测试计划.jpg

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


JMeter数据库测试计划_2_测试计划的属性页.jpg

  在属性页的最下面,我们看到设置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"则是指配置好的并发情形发生多少次。

JMeter数据库测试计划_3_线程组的属性页.jpg

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

JMeter数据库测试计划_4_用户自定义的变量.jpg

 

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

Name Value
str ${__split(D610 or 笔记本|D610 or D620|D620|服务器,keyword,|)}
many_sql p_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连接设置

JMeter数据库测试计划_5_JDBC连接设置.jpg

 

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


JMeter数据库测试计划_6_1_JDBC请求_使用预编译参数.jpg

 

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

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

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


JMeter数据库测试计划_7_三个监听器.jpg

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


JMeter数据库测试计划_7_1_监听器_表格看响应结果.jpg

 

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

JMeter数据库测试计划_7_2_1_监听器_树形查看响应.jpg

 

JMeter数据库测试计划_7_2_2_监听器_树形查看响应_执行SQL.jpg

 

JMeter数据库测试计划_7_2_3_监听器_树形查看响应_SQL执行结果.jpg

 

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

JMeter数据库测试计划_7_3_监听器_图形查看响应.jpg

至于上面的图形监听器,可以宏观的观察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语句如下:

JMeter数据库测试计划_7_2_3_监听器_树形查看响应_某个具体的SQL语句.jpg


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

后记

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

分享到:
评论
1 楼 maatlawson 2010-06-03  
讲的很详细啊!

相关推荐

    jmeter-压力测试报告-超细

    本文将深入探讨JMeter的使用方法、重要功能以及如何进行超细粒度的压力测试报告分析。 首先,JMeter是一款由Apache软件基金会开发的负载和性能测试工具,适用于Web应用、FTP服务器、数据库和其他协议的服务。它支持...

    jmeter教程之--数据库测试(oracle , mysql)

    通过以上步骤,你可以使用JMeter有效地对Oracle和MySQL数据库进行性能测试。这有助于发现系统瓶颈,评估数据库的性能极限,并为系统优化提供数据支持。记得在实际操作中,根据项目需求和具体环境调整测试方案,以...

    JMeter数据库压力测试工具学习资料.rar

    JMeter数据库压力测试工具学习资料JMeter数据库压力测试工具学习资料JMeter数据库压力测试工具学习资料JMeter数据库压力测试工具学习资料JMeter数据库压力测试工具学习资料JMeter数据库压力测试工具学习资料JMeter...

    jmeter mqtt服务器压力测试

    JMeter,一个由Apache软件基金会开发的开源性能测试工具,被广泛应用于Web应用、数据库和其他服务器的压力测试。本文将详细介绍如何使用JMeter进行MQTT服务器的压力测试。 首先,我们需要理解MQTT协议。MQTT是一种...

    【jmeter】jmeter-plugins-manager-1.3.jar下载

    Apache JMeter是一款开源的性能测试工具,广泛应用于Web应用、FTP服务器、数据库等服务的负载和压力测试。JMeter的强大之处在于其丰富的插件生态系统,这些插件能够扩展JMeter的功能,满足各种复杂的测试需求。其中...

    JMeterPlugins-XMPP-1.4.0

    JMeter允许用户模拟多种用户行为,包括HTTP请求、FTP请求、TCP连接、SOAP/REST服务调用等,同时支持分布式测试,以实现大规模的压力测试。 JMeterPlugins-XMPP-1.4.0插件的引入,极大地扩展了JMeter对XMPP协议的...

    jmeter-plugins-manager-1.7.jar JMeter 管理插件

    Apache JMeter是一款功能强大的性能测试工具,广泛应用于Web应用、FTP服务器、数据库等服务的压力测试。为了扩展JMeter的功能,社区开发了各种插件,其中JMeter Plugins Manager就是一款不可或缺的辅助工具。本文将...

    apache-jmeter-5.2.1--.zip

    JMeter是开源的,由Apache软件基金会维护,广泛应用于性能测试领域,尤其在Web应用的负载和压力测试上。它允许用户创建灵活且可扩展的测试计划,模拟多个并发用户执行各种操作,如点击链接、提交表单或执行其他与Web...

    使用jmeter做ws压力测试

    这篇博客文章“使用jmeter做ws压力测试”将深入探讨如何利用JMeter进行Web服务的压力测试。 首先,了解JMeter的基本结构至关重要。JMeter由线程组、采样器、监听器、断言、定时器、配置元件等组件构成。线程组模拟...

    JMeterPlugins-WebDriver-1.4.0.zip

    在性能测试领域,Apache JMeter是一款广泛使用的开源工具,它能够模拟大量用户并发对服务器进行压力测试,从而评估系统性能。而JMeterPlugins-WebDriver-1.4.0.zip是JMeter的一个扩展插件,它引入了WebDriver支持,...

    jmeter-results-detail-report_30.rar

    JMeter是一款开源、Java编写的负载和性能测试工具,广泛应用于Web应用的压力测试。这个压缩包很可能包含了在30分钟测试周期内收集的详细数据,用于分析系统的性能瓶颈和稳定性。 描述 "jmeter-results-detail-...

    jmeter-性能测试-压力测试

    Apache JMeter是一款广泛使用的开源工具,专为性能测试和压力测试设计。本文将深入探讨JMeter的相关知识点,包括其基本概念、功能、使用方法以及如何进行性能调优和数据监控。 一、JMeter简介 Apache JMeter是一款...

    Jmeter-5.6.2压力测试工具

    Apache JMeter是一款强大的开源压力测试工具,主要由Apache组织开发并维护,其最新版本为5.6.2。这款工具完全基于Java语言,因此具备跨平台特性,可以在多种操作系统上运行,如Windows、Linux和Mac OS等。JMeter主要...

    压力测试工具:apache-jmeter-5.0

    通过熟练掌握Apache JMeter,你可以对任何基于这些协议的服务进行详尽的压力测试,确保在实际环境中能够稳定运行,为用户提供高质量的服务。对于开发者和运维人员来说,JMeter是性能优化和问题排查的重要工具。

    apache-jmeter-3.1.zip、jmeter-plugins-manager-0.11.jar、mysql-connector-java-5.1.3

    通过JMeter的JDBC连接配置和采样器,你可以执行SQL查询、插入数据、更新记录,甚至可以测试数据库的读写性能。 使用JMeter时,首先你需要设置一个JDBC连接配置,填写数据库URL(通常格式为`jdbc:mysql://hostname:...

    jmeter-plugins-redis2

    这个插件正是为此目的而生,它使得JMeter能够方便地在接口之间保存和读取数据,为单接口压力测试提供了极大的便利。 使用"jmeter-plugins-redis2",测试者可以创建自定义的JMeter samplers(采样器),这些采样器...

    用jmeter工具测试GBase数据库(csdn)————程序.pdf

    标题所述的《用jmeter工具测试GBase数据库》是一篇详细介绍如何使用Apache JMeter进行GBase 8s数据库压力测试的教程。这篇文章旨在帮助IT专业人员在系统上线前进行必要的性能评估,以发现潜在的问题,预测系统承载...

    jmeter项目压力测试工具

    《JMeter:强大的压力测试工具》 在信息技术领域,性能测试是评估系统稳定性和可扩展性的重要环节,其中压力测试尤为关键。今天我们要探讨的是一个名为JMeter的开源项目压力测试工具,它以其强大功能和易用性在业界...

    apache-jmeter-5.0压力测试安装包

    Apache JMeter是一款强大的开源性能测试工具,主要用于模拟大量并发用户对服务器、网络或者数据库等进行压力测试,以评估系统的稳定性、响应时间和资源消耗情况。在本"apache-jmeter-5.0压力测试安装包"中,包含的是...

    压力测试工具-jmeter-支持HTTP、FTP、数据库等

    Apache JMeter是一款强大的开源压力测试工具,主要用于检测Web应用程序的性能和负载能力。它支持多种协议,包括HTTP、FTP和数据库交互,使得测试者能够全面评估应用在高并发情况下的表现。由于JMeter是免安装的,只...

Global site tag (gtag.js) - Google Analytics