(原创)如何更高效的进行数据库压力测试
版权声明:本文为原创文章,转载请先联系并标明出处
故事发生在2013年,long long ago,公司有个项目在针对数据库选型的时候曾经做过一次POC性能测试,那次主要是比较在公司的业务场景下,hana和Oracle的处理能力,那个时候还在使用LoadRunner,当时为了屏蔽应用本身对结果的影响,特意列选了业务系统几个典型的sql,直接在两个数据库上进行压力测试。
当时真是痛苦的经历啊,反复斟酌再三决定使用LoadRunner的java vuser协议,直接通过JDBC连接数据库,然后执行特定的几条SQL。
首先是LoadRunner是32 bit版本,所以JDK也只能选择32 bit版本;
然后建立数据连接,访问数据库,执行SQL,所有这些都要自己编码。当年就是因为不喜欢编码,才选择的测试岗啊,为什么最后还是要来写代码(内牛满面.jpg)。
后来又想到频繁建立和销毁数据库连接简直是性能杀手,又不得不在LoadRunner里维护了一个数据库连接池。(我特么是在写一个应用Demo吗?一副懵逼脸.jpg)
前前后后折腾了半个多月,才终于把编码简陋且粗糙的脚本正式跑起来。
经历过这次之后,再有直接压测数据库的事情,我都是能躲就躲,因为我是真的特别特别讨厌写代码啊,尽管后来因为意志不坚定而又做了一次达梦和Oracle的POC性能测试。
时间再拉回到现在,前段时间公司有个项目做性能测试,因为其中某个核心的业务逻辑是写在存储过程的,所以在做性能测试方案的时候,这个存储过程也入选了测试对象中,尽管我依然还是不愿意做针对数据库的压力测试,但也没办法,谁让人家顶着“核心”这两个字的主角光环呢,这个时候我们已经全面使用HyperPacer来进行日常的各种测试工作了。
下面就再来说一说用HyperPacer做数据库压力测试的过程。
按照国际惯例,还是先show一下完成后的脚本,如下:
是不是很简单明了?在这个脚本里依次使用到了如下几个元件:配置元件里的JDBC连接配置、参数化管理器,取样器里的JDBC取样器。
首先在我们的工程里添加JDBC连接配置,在连接配置填写信息如下:
都是常规的信息填写,没太多可说的。
然后在场景并发测试下添加JDBC取样器,如下所示:
这里各个编辑控件和下拉控件的使用及每个选项的说明,只要在HyperPacer的工具栏上点击帮助就可以看到,已经写的很清晰了,我们这里不再重新写一遍辣么严肃的话了。
在绑定变量赋值的编辑区域里,我们看到在前两个变量赋值这里做了参数化,关于参数化和数据池使用的详细解释可以参考社区的其它文章: 《如何在性能测试中实现脚本参数化》 这里需要注意的是:此处绑定变量赋值的顺序和个数需要和存储过程中定义的参数保持完全一致。
在绑定变量类型的编辑区域,这里的类型只可以是在java.sql.Types中定义的类型,并且要保证和我们调用的存储过程中的参数类型保持一致。
我们这里说的类型保持一致要分为两方面来看:
一方面要保证用于传参的变量类型保持一致,即这里写的JDBC类型要和SQL类型保持一致,关于保持类型一致的转换映射关系可以查看JDK的官方文档,针对每一种类型都有很详细的说明: 请点击此处~ 这里注意要根据自己HyperPacer配置使用的JDK版本确定相应的官方文档,我这里列出的是1.5版本的一个官方文档。
另一方面要保证此处填写的类型与存储过程的参数类型保持一致,我们知道存储过程的参数类型有输入参数IN、输出参数OUT以及输入输出参数IN OUT类型,因此在绑定变量类型这里也要加上相应的参数类型前缀 。如果没有加上类型前缀的话,工具默认认为参数类型为IN。比如在咱们的例子中存储过程最后面的4个参数为输出参数,则在绑定变量类型这里填写类型的时候就需要加上OUT作为前缀。
返回变量列表不要求必须填写,如果在后面的测试步骤里需要用到该存储过程的返回值,就必须要写,否则可以不写。在咱们的例子里,因为这里返回的“transaction_id”在下一个JDBC取样器里要作为调用存储过程的输入,所以可以看到咱们填写了返回变量列表,并且和存储过程的输出参数保持一致。
按照上面的讲解,再依次将其它要串行执行的存储过程也如此添加JDBC取样器并设置好,我们的测试脚本就算是完成了。
如此操作下来,使用HyperPacer进行数据库压力测试的脚本设计完成,总共耗时不到5分钟。然后再回头想一想前面文章开头我们说的用LoadRunner来实现数据库性能测试脚本的工作量。不言而喻,在针对数据库进行性能测试这件事上,HyperPacer明显要方便快捷的多。
当然,这样说绝对没有诋毁LoadRunner不好的意思,作为一个市场占有量最大的商业性能测试工具,LoadRunner的功能在每个性能测试从业者心中无疑都是很强大的。只是在细节方面,HyperPacer和Jmeter作为... 等等,Jmeter?13年的时候我为什么没想到用Jmeter去做HANA和Oracle的对比测试?
啊~~~,多么痛的领悟。
参考文章: LoadRunner压力测试实例 原文出处