第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命令和計劃應用的介紹,有興趣的同志,可以看一下這部分內容。
摘自:http://www.cnblogs.com/tester2test/archive/2008/05/22/1204842.html