博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种特殊的数据库性能测试方法
阅读量:6618 次
发布时间:2019-06-25

本文共 3668 字,大约阅读时间需要 12 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
Storyboard只支持iOS5.0或者以上的版本
查看>>
搜索引擎蜘蛛爬虫原理
查看>>
《孔子》观后感
查看>>
kafka备份机制——zk选举leader,leader在broker里负责备份
查看>>
PictureBox 读取图片及绘画
查看>>
MFC 的CLIST控件
查看>>
android92 aidl远程进程通信
查看>>
[Java IO]01_File类和RandomAccessFile类
查看>>
PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范
查看>>
Hadoop HDFS概念学习系列之HDFS Master/Slave架构(十)
查看>>
Windows c++应用程序通用日志组件(组件及测试程序下载)
查看>>
Hadoop HDFS概念学习系列之HDFS升级和回滚机制(十二)
查看>>
jquery select操作大全
查看>>
C# GDI+ 简单绘图 (三)
查看>>
ExtJS 4.2 教程-02:bootstrap.js 工作方式
查看>>
ABP理论学习之MVC控制器(新增)
查看>>
现代软件工程 第五章 【团队和流程】练习与讨论
查看>>
Html-文档类型(DTD)和DOCTYPE
查看>>
Linux进程冻结技术【转】
查看>>
Solr与MySQL查询性能对比
查看>>