天天看點

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

本篇博文講解以MySQL為例,搞懂JDBC Request中MySQL的使用方法,換成其它資料庫,

如Oracle、PSQL也會很容易上手。

一、基本配置

1.首先我們先了解一下,不同資料庫的驅動類和URL格式

Database

Driver class

Database URL

MySQL

com.mysql.jdbc.Driver

jdbc:mysql://host[

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

port]/dbname

PostgreSQL

org.postgresql.Driver

jdbc:postgresql:{dbname}

Oracle

oracle.jdbc.OracleDriver

jdbc:oracle:thin:@//host:port/service OR

jdbc:oracle:thin:@(description=(address=(host={mc-name})

(protocol=tcp)(port={port-no}))(connect_data=(sid={sid})))

Ingres(2006)

ingres.jdbc.IngresDriver

jdbc:ingres://host:port/db[;attr=value]

Microsoft SQL Server (MS JDBC driver)

com.microsoft.sqlserver.jdbc.SQLServerDriver

jdbc:sqlserver://host:port;DatabaseName=dbname

ApacheDerby

org.apache.derby.jdbc.ClientDriver

jdbc:derby://server[:port]/databaseName[;URLAttributes=value[;…]]

2.将MySQL的JDBC驅動jar包複制到Jmeter的lib目錄下,本文中使用的是 mysql-connector-java-8.0.16.jar

或者在Jmeter的Test Plan中直接引入jar包,如下圖所示:

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

二、配置JDBC Connection Configuration

JDBC Request經常需要配合配置元件JDBC Connection Configuration一起使用,先來看

一下JDBC Connection Configuration的相關配置。

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

這裡我們主要關注Variable Name Bound to Pool和Database Connection Configuration兩

部分内容,其它字段可以保持預設值。

Variable Name:資料庫連接配接池的名稱,後續配置還會用到這個名稱

Database URL:資料庫的URL,jdbc:mysql://ip Of The Server:port/表名

JDBC Driver class:JDBC驅動

Username:要連接配接的資料庫名稱

Password:要連接配接的資料庫密碼

三、配置JDBC Request

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

Variable Name:資料庫連接配接池的名稱,需要與JDBC Connection Configuration的Variable Name名稱保持一緻

Query:填寫要被執行的SQL語句

Parameter valus:參數值

Parameter types:參數類型

Variable names:儲存sql語句傳回結果的變量名

Result variable name:建立一個對象變量,儲存所有傳回的結果

Query timeout:查詢逾時時間

Handle result set:定義如何處理由callable statements語句傳回的結果

我們添加一個監聽器,儲存腳本運作一次,檢視執行結果。

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

需要注意的是,Query Type不同時,對應執行代碼也不一樣:

(1)Query Type為Select Statement時,對應執行代碼為:

stmt =conn.createStatement();

ResultSet rs= null;

rs=stmt.executeQuery(sql);returngetStringFromResultSet(rs).getBytes(ENCODING);

(2)Query Type為Callable Statement時,對應執行代碼為:

CallableStatement cstmt =getCallableStatement(conn);int out[]=setArguments(cstmt);

boolean hasResultSet=cstmt.execute();

String sb= resultSetsToString(cstmt,hasResultSet, out);returnsb.getBytes(ENCODING);

(3)Query Type為Update Statement時,對應執行代碼為:

stmt =conn.createStatement();

stmt.executeUpdate(sql);int updateCount =stmt.getUpdateCount();

String results= updateCount + "updates";returnresults.getBytes(ENCODING);

(4)Query Type為Prepared Select Statement時,對應執行代碼為:

PreparedStatement pstmt =getPreparedStatement(conn);

setArguments(pstmt);

ResultSet rs= null;

rs=pstmt.executeQuery();returngetStringFromResultSet(rs).getBytes(ENCODING);

(5)Query Type為Prepared Update Statement時,對應執行代碼為:

PreparedStatement pstmt=getPreparedStatement(conn);

setArguments(pstmt);

pstmt.executeUpdate();

String sb= resultSetsToString(pstmt,false,null);returnsb.getBytes(ENCODING);

(6)Query Type為Rollback時,對應執行代碼為:

conn.rollback();returnROLLBACK.getBytes(ENCODING);

(7)Query Type為Commit時,對應執行代碼為:

conn.commit();returnCOMMIT.getBytes(ENCODING);

(8)Query Type為AutoCommit(false)時,對應執行代碼為:conn.setAutoCommit(false);returnAUTOCOMMIT_FALSE.getBytes(ENCODING);

(9)Query Type為AutoCommit(true)時,對應執行代碼為:

conn.setAutoCommit(true);return AUTOCOMMIT_TRUE.getBytes(ENCODING);

(10)其它情況直接抛異常:throw new UnsupportedOperationException("Unexpected query type:"+_queryType);

四、JDBC Request參數化

方法(一):自定義使用者變量,然後進行引用

1.在Test Plan界面User Defined Variables中定義需要的變量

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

2.在JDBC Request界面SQL Query輸入框中以${變量名}的形式引用變量

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

方法(二):在被執行的SQL語句中使用“?”作為占位符,并傳遞參數值和參數類型。其中,

傳遞的參數值有常量和變量之分。

1.當傳遞的參數值是常量時,如下圖所示,傳入的使用者ID和使用者号碼:

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

2.當傳遞的參數值是變量時,如下圖中的${user_id}:

jmeter+mysql+request_Jmeter JDBC Request 使用詳解

五、Variables names參數使用方法

Variable names:儲存sql語句傳回結果的變量名,如果給這個參數設定了值,會儲存sql

語句傳回的資料和傳回資料的總行數。

id

name

phone

A_1

Mike

C_1

A_2

Lucy

C_2

假如,sql語句傳回2行,3列,且Variables names設定為A, ,C,那麼如下變量會被設定為:

A_#=2 (總行數)  A_1=第1列, 第1行  A_2=第1列, 第2行

C_#=2 (總行數)    C_1=第3列, 第1行  C_2=第3列, 第2行

如果傳回結果為0,那麼A_#和C_#會被設定為0,其它變量不會設定值。

如果第一次傳回6行資料,第二次隻傳回3行資料,那麼第一次那多的3行資料變量會被清除。

可以使用${A_#}、${A_1}...來擷取相應的值

我們以上面的資料庫為例,設定Variables names的值為p1、p2,并添加Debug Sampler

來檢視輸出結果。根據資料庫的實際情況,我可以預期p1_#的值為22,p1_1的值為

e59af3ba1110f433bd2b0f4996011cab。

jmeter+mysql+request_Jmeter JDBC Request 使用詳解
jmeter+mysql+request_Jmeter JDBC Request 使用詳解

由執行結果可以看出我的預期是正确的。