一种特殊的数据库性能测试方法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
性能测试 PTS,5000VUM额度
简介:

4章 应用实例讲解

4.1 一种特殊的数据库性能测试方法

很多同志在进行数据方面性能测试时束手无策,前面在第二章的第二节我们已经介绍了如何应用ODBC 协议录制LoadRunner 8.0 自身带的 Flights-ODBC_Access ”例子。这里作者为您提供另一种简便的方法。问题描述:一个面向全国各个中小学的信息管理系统,随着系统被广泛的应用,访问人数的急剧增加、数据量也在飞速增长,如何为用户提供方便、快捷的应用呢?

4.1.1数据库集群项目背景介绍

经过公司相关技术人员的讨论,决定采用数据库的集群技术来解决这些问题,将先前1 台数据应用服务器扩展为3台。数据库为Mysql ,如果您关心数据库的集群技术,请查阅相关资料,在这里不再赘述。实施的整体思路是这样。由于操作人员主要是进行数据的插入工作,在某一段时间内操作人员比较集中,数据量也较大,为了估计集群后会给性能带来多大的提升,我们分别部署了两套运行环境,一套是先前的单一数据库应用服务器环境,另外一个则是三台数据库服务器进行集群。为了记录用户并发插入大数据量系统的响应时间,在相关表中添加了日期时间型字段,记录插入首条和末尾记录的时间,这样,末尾时间减去首条记录插入时间,就是多用户并发插入大批量数据的执行时间了。实施过程如下:第一步,数据库管理员用Java 写了一段代码:
import java.sql.*;
public class testclus {
       public static void main(String[] args) {
// 如果传入参数个数不等于2 ,则给出提示信息" 调用:java testclus ip:port recordcnt"
              if (args.length!=2)
              {
                     System.out.println(" 调用:java testclus ip:port recordcnt");
                     return;
              }
  // 根据传入参数,动态建立连接字符串
              String URL = "jdbc:mysql://" +args[0]+"/testclus?characterEncoding=gbk";
              int cnt = Integer.parseInt(args[1]);
              try {
  // 声明并得到起始记录插入时间
                     long timeBegin;
                     java.util.Date   d1 = new java.util.Date();
  // 数据库连接初始化操作
                     Class.forName("com.mysql.jdbc.Driver").newInstance();
                     Connection conn = DriverManager.getConnection(URL,"root","admin");
  // 循环插入记录
                     PreparedStatement pstmt = conn.prepareStatement("insert into test(cnt, timer)
values (?, now())");
                     Statement  s=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
                     timeBegin = d1.getTime();  
                     for (int i=1; i<=cnt; i++)
                     {
                            pstmt.setInt(1, i);
                            pstmt.executeUpdate();
                            ResultSet rs=s.executeQuery("select count(*) from test");
                     }
                     conn.close();
// 得到末尾记录和起始记录插入的时间差值并输出
                     java.util.Date   d2 = new java.util.Date();  
                     System.out.println(d2.getTime()-timeBegin+"  毫秒");
              }
    // 异常处理部分
              catch(ClassNotFoundException e) {
                     System.out.println(" 找不到驱动程序");
                     e.printStackTrace();
              }
              catch(SQLException e) {
                     e.printStackTrace();
              }
              catch (Exception e) {
                     e.printStackTrace();
              }
       }
}
接下来,再建立一个批处理文件,批处理文件内容如下:
@echo off
if "%JAVA_HOME%" == "" goto error_setting
set CLASSPATH=%JAVA_HOME%"jre"lib"rt.jar
set CLASSPATH=%CLASSPATH%;mysql-connector-java-3.1.7-bin.jar;testclus.jar
%JAVA_HOME%"bin"java -classpath "%CLASSPATH%" testclus %1 %2
goto end
:error_setting
echo -------------------------------------------------------------------------------------
echo  使用方法:
echo     1. 请设置JAVA_HOME 环境变量(JDK1.4 安装路径);
echo     2. 请先将本程序所在的目录选择为当前目录后再执行。
echo -------------------------------------------------------------------------------------
goto end
:end
set CLASSPATH=
批处理接受2 个参数,第一个参数为数据库服务器的“IP 地址+: +端口号”,第二个参数为需要循环插入的数据数。如:testclus 192.168.0.45:3306 1000  ,其含义就是向IP 地址为192.168.0.45 ,端口为3306 mysql 数据库中插入1000 条记录。

4.1.2批处理方式解决方案

LoadRunner  如何调用批处理文件呢?LoadRunner  中可以调用System ()函数来调用一个可执行文件或者批处理文件等,所以我们就可以直接调用该函数,指定相关参数,为了能够进行多用户并发,需要插入集合点。相关脚本如下:
#include "web_api.h"
Action()
{
    lr_rendezvous("in");
    system("testclus 192.168.0.45:3306 1000");
    return 0;
}
为了进行集群测试,还需要另外创建两个脚本,两个脚本如下:
#include "web_api.h"
Action()
{
    lr_rendezvous("in");
    system("testclus 192.168.0.44:3306 1000");
       return 0;
}
#include "web_api.h"
Action()
{
    lr_rendezvous("in");
    system("testclus 192.168.0.46:3306 1000");
       return 0;
}
接下来,就可以分别在Controller 中进行负载了,相应场景设置如下:

4 1 :单一数据应用服务器场景设置

4 2 :三台数据应用服务器集群场景设置
而后该场景在数据库为空和数据库存在百万条记录情况下分别进行测试,经过几轮测试对结果的分析发现集群后性能比单台数据应用服务器的性能提高3 5 倍。
【作者提示】
1.           在进行性能测试的时候,一定要注意环境的一致,包括:操作系统、应用软件的版本以及硬件的配置等,而且在进行数据库方面的测试的时候一定要注意数据库的记录数、配置等要一致,只有在相同条件下进行测试,才可以对结果进行比较。
2.           如果几个脚本要实现并发,集合点一定要设置成相同的名称,如在本例中名称都为“in ”。
3.          Java 程序运行所依赖的jar 包以及批处理文件应放置到脚本所在目录,否则无法正确运行。
4.           将场景保存以后,建立一个批处理文件,通过wlrun 命令来启动Controller 执行场景也是一种非常好的方法,通过AT 命令或者计划调用批处理则控制更加灵活,与Controller 场景的定时运行取得相同的效果。在本书的第六章提供了AT 命令和计划应用的介绍,有兴趣的同志,可以看一下这部分内容。




本文转自 fish_yy 51CTO博客,原文链接:http://blog.51cto.com/tester2test/138256,如需转载请自行联系原作者

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
6天前
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
17 7
测试用例设计方法之基本路径测试法
|
6天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
40 7
Jmeter实现WebSocket协议的接口测试方法
|
5天前
|
敏捷开发 数据可视化 Devops
敏捷测试价值观、方法和实践读书笔记(4)
本章节探讨了敏捷测试执行的关键概念与实践。首先介绍了用户故事及其重要性,强调其在敏捷开发中的角色,并阐述了用户故事的 INVEST 原则。接着分析了用户故事生命周期中的测试关注点,包括定义、处理、完成及验收阶段的测试活动。此外,还对比了不同测试术语的差异,并提供了敏捷测试计划的策略与过程。通过看板等工具实现任务管理与跟踪,确保测试活动高效进行。最后,介绍了敏捷测试中的度量指标,帮助团队评估测试效果。
16 5
敏捷测试价值观、方法和实践读书笔记(4)
|
5天前
|
监控 架构师 Devops
敏捷测试价值观、方法和实践读书笔记(3)
本章节介绍敏捷测试转型框架,涵盖模型概览、实施难度与顺序、文化转变、角色技能需求及测试流程。敏捷测试转型模型包括文化、组织、流程与实践等关键要素,并针对各层面提出具体实施建议与障碍解决方案。此外,详细阐述了不同敏捷测试角色的技能需求与职责,以及从Sprint内至跨Sprint的测试流程与交付物。
16 5
敏捷测试价值观、方法和实践读书笔记(3)
|
5天前
|
开发框架 数据可视化 项目管理
敏捷测试价值观、方法和实践读书笔记(1)
敏捷软件开发宣言在身体力行的同时也帮助我们一直在实践中探寻更好的软件开发方法。由此,我们建立了如下价值观:个体和互动 高于 流程和工具工作的软件,高于 详尽的文档客户合作, 高于 合同谈判响应变化,高于 遵循计划。也就是说,尽管右项有其价值,但我们更重视左项的价值。
23 4
敏捷测试价值观、方法和实践读书笔记(1)
|
5天前
|
JavaScript 前端开发 Java
敏捷测试价值观、方法和实践读书笔记(5)
本章节介绍了敏捷功能测试的原则与实践,包括单元测试的概念及其编写步骤,测试驱动开发(TDD)的流程,以及如何通过模拟对象进行测试。详细讲解了单元测试的编写方法,如初始化对象、执行操作及验证结果,并探讨了 TDD 的五个步骤。通过具体案例展示了如何逐步完善储蓄账户的功能测试,包括存款、取款及异常处理。此外,还讨论了代码覆盖率的重要性及其局限性,强调了测试充分性比单纯追求代码覆盖率更为关键。
11 3
敏捷测试价值观、方法和实践读书笔记(5)
|
4天前
|
消息中间件 关系型数据库 数据库
Python实时监测数据库表数据变化的方法
在实现时,需要考虑到应用的实时性需求、数据库性能影响以及网络延迟等因素,选择最适合的方法。每种方法都有其适用场景和限制,理解这些方法的原理和应用,将帮助开发者在实际项目中做出最合适的技术选择。
37 17
|
6天前
|
关系型数据库 MySQL 测试技术
《性能测试》读书笔记_数据库优化
《性能测试》读书笔记_数据库优化
20 7
|
7天前
|
Oracle 安全 关系型数据库
Oracle数据恢复—Oracle数据库误删除的数据恢复方法探讨
删除Oracle数据库数据一般有以下2种方式:delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法(不考虑全库备份和利用归档日志)。
|
5天前
|
机器人 测试技术
敏捷测试价值观、方法和实践读书笔记(6)
验收测试驱动开发(ATDD)强调在开发前定义验收标准,并通过自动化测试确保用户价值得到满足。验收测试关注用户需求是否实现,而非代码细节。ATDD涉及用户、产品负责人、开发人员及测试人员,通过讨论、开发和交付三个阶段,确保产品符合预期。此方法有助于团队更好地理解和实现用户需求。
17 5