《软件性能测试与LoadRunner实战》书籍样稿作者博客:第1页作者:MSN:win_soft@163.com邮箱:tony.yuy@gmail.com网上订购地址:《软件性能测试与LoadRunner实战》书籍样稿作者博客:第2页作者:MSN:win_soft@163.com邮箱:tony.yuy@gmail.com第4章应用实例讲解4.1一种特殊的数据库性能测试方法很多同志在进行数据方面性能测试时束手无策,前面在第二章的第二节我们已经介绍了如何应用ODBC协议录制LoadRunner8.0自身带的“Flights-ODBC_Access”例子。这里作者为您提供另一种简便的方法。问题描述:一个面向全国各个中小学的信息管理系统,随着系统被广泛的应用,访问人数的急剧增加、数据量也在飞速增长,如何为用户提供方便、快捷的应用呢?4.1.1数据库集群项目背景介绍经过公司相关技术人员的讨论,决定采用数据库的集群技术来解决这些问题,将先前1台数据应用服务器扩展为3台。数据库为Mysql,如果您关心数据库的集群技术,请查阅相关资料,在这里不再赘述。实施的整体思路是这样。由于操作人员主要是进行数据的插入工作,在某一段时间内操作人员比较集中,数据量也较大,为了估计集群后会给性能带来多大的提升,我们分别部署了两套运行环境,一套是先前的单一数据库应用服务器环境,另外一个则是三台数据库服务器进行集群。为了记录用户并发插入大数据量系统的响应时间,在相关表中添加了日期时间型字段,记录插入首条和末尾记录的时间,这样,末尾时间减去首条记录插入时间,就是多用户并发插入大批量数据的执行时间了。实施过程如下:第一步,数据库管理员用Java写了一段代码:importjava.sql.*;publicclasstestclus{publicstaticvoidmain(String[]args){//如果传入参数个数不等于2,则给出提示信息调用:javatestclusip:portrecordcntif(args.length!=2){System.out.println(调用:javatestclusip:portrecordcnt);return;}//根据传入参数,动态建立连接字符串StringURL=jdbc:mysql://+args[0]+/testclus?characterEncoding=gbk;《软件性能测试与LoadRunner实战》书籍样稿作者博客:第3页作者:MSN:win_soft@163.com邮箱:tony.yuy@gmail.comintcnt=Integer.parseInt(args[1]);try{//声明并得到起始记录插入时间longtimeBegin;java.util.Dated1=newjava.util.Date();//数据库连接初始化操作Class.forName(com.mysql.jdbc.Driver).newInstance();Connectionconn=DriverManager.getConnection(URL,root,admin);//循环插入记录PreparedStatementpstmt=conn.prepareStatement(insertintotest(cnt,timer)values(?,now()));Statements=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);timeBegin=d1.getTime();for(inti=1;i=cnt;i++){pstmt.setInt(1,i);pstmt.executeUpdate();ResultSetrs=s.executeQuery(selectcount(*)fromtest);}conn.close();//得到末尾记录和起始记录插入的时间差值并输出java.util.Dated2=newjava.util.Date();System.out.println(d2.getTime()-timeBegin+毫秒);}//异常处理部分catch(ClassNotFoundExceptione){System.out.println(找不到驱动程序);e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}}}接下来,再建立一个批处理文件,批处理文件内容如下:@echooffif%JAVA_HOME%==gotoerror_settingsetCLASSPATH=%JAVA_HOME%\jre\lib\rt.jar《软件性能测试与LoadRunner实战》书籍样稿作者博客:第4页作者:MSN:win_soft@163.com邮箱:tony.yuy@gmail.comsetCLASSPATH=%CLASSPATH%;mysql-connector-java-3.1.7-bin.jar;testclus.jar%JAVA_HOME%\bin\java-classpath%CLASSPATH%testclus%1%2gotoend:error_settingecho-------------------------------------------------------------------------------------echo使用方法:echo1.请设置JAVA_HOME环境变量(JDK1.4安装路径);echo2.请先将本程序所在的目录选择为当前目录后再执行。echo-------------------------------------------------------------------------------------gotoend:endsetCLASSPATH=批处理接受2个参数,第一个参数为数据库服务器的“IP地址+:+端口号”,第二个参数为需要循环插入的数据数。如:testclus192.168.0.45:33061000,其含义就是向IP地址为192.168.0.45,端口为3306的mysql数据库中插入1000条记录。4.1.2批处理方式解决方案LoadRunner如何调用批处理文件呢?LoadRunner中可以调用System()函数来调用一个可执行文件或者批处理文件等,所以我们就可以直接调用该函数,指定相关参数,为了能够进行多用户并发,需要插入集合点。相关脚本如下:#includeweb_api.hAction(){lr_rendezvous(in);system(testclus192.168.0.45:33061000);return0;}为了进行集群测试,还需要另外创建两个脚本,两个脚本如下:#includeweb_api.hAction(){lr_rendezvous(in);《软件性能测试与LoadRunner实战》书籍样稿作者博客:第5页作者:MSN:win_soft@163.com邮箱:tony.yuy@gmail.comsystem(testclus192.168.0.44:33061000);return0;}#includeweb_api.hAction(){lr_rendezvous(in);system(testclus192.168.0.46:33061000);return0;}接下来,就可以分别在Controller中进行负载了,相应场景设置如下:图4-1:单一数据应用服务器场景设置图4-2:三台数据应用服务器集群场景设置而后该场景在数据库为空和数据库存在百万条记录情况下分别进行测试,经过几轮测试对结果的分析发现集群后性能比单台数据应用服务器的性能提高3到5倍。【作者提示】1.在进行性能测试的时候,一定要注意环境的一致,包括:操作系统、应用软件的版本以及硬件的配置等,而且在进行数据库方面的测试的时候一定要注意数据库的记录数、配置等要一致,只有在相同条件下进行测试,才可以对结果进行比较。2.如果几个脚本要实现并发,集合点一定要设置成相同的名称,如在本例中名称都为“in”。3.Java程序运行所依赖的jar包以及批处理文件应放置到脚本所在目录,否则无法正确运行。4.将场景保存以后,建立一个批处理文件,通过wlrun命令来启动Controller执行场景也是一种非常好的方法,通过AT命令或者计划调用批处理则控制更加灵活,与Controller场景的定时运行取得相同的效果。在本书的第六章提供了AT命令和计划应用的介绍,有兴趣的同志,可以看一下这部分内容。