Jmeter JDBC Request 使用詳解
點擊上方藍色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達
? 作者?|??Edisonyao?
來源 |? urlify.cn/M77Zbi
本篇博文講解以MySQL為例,搞懂JDBC Request中MySQL的使用方法,換成其它數(shù)據(jù)庫,
如Oracle、PSQL也會很容易上手。
一、基本配置
1.首先我們先了解一下,不同數(shù)據(jù)庫的驅(qū)動類和URL格式
| Database | Driver class | Database URL |
| MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host[ 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驅(qū)動jar包復(fù)制到Jmeter的lib目錄下,本文中使用的是?mysql-connector-java-8.0.16.jar?
或者在Jmeter的Test Plan中直接引入jar包,如下圖所示:

MySQL驅(qū)動下載:https://mvnrepository.com/artifact/mysql/mysql-connector-java
二、配置JDBC Connection Configuration
JDBC Request經(jīng)常需要配合配置元件JDBC Connection Configuration一起使用,先來看
一下JDBC Connection Configuration的相關(guān)配置。

這里我們主要關(guān)注Variable Name Bound to Pool和Database Connection Configuration兩
部分內(nèi)容,其它字段可以保持默認(rèn)值。
Variable Name:數(shù)據(jù)庫連接池的名稱,后續(xù)配置還會用到這個名稱
Database URL:數(shù)據(jù)庫的URL,jdbc:mysql://ip Of The Server:port/表名
JDBC Driver class:JDBC驅(qū)動
Username:要連接的數(shù)據(jù)庫名稱
Password:要連接的數(shù)據(jù)庫密碼
三、配置JDBC Request

Variable Name:數(shù)據(jù)庫連接池的名稱,需要與JDBC Connection Configuration的Variable Name名稱保持一致
Query:填寫要被執(zhí)行的SQL語句
Parameter valus:參數(shù)值
Parameter types:參數(shù)類型
Variable names:保存sql語句返回結(jié)果的變量名
Result variable name:創(chuàng)建一個對象變量,保存所有返回的結(jié)果
Query timeout:查詢超時時間
Handle result set:定義如何處理由callable statements語句返回的結(jié)果
我們添加一個監(jiān)聽器,保存腳本運行一次,查看執(zhí)行結(jié)果。

?需要注意的是,Query Type不同時,對應(yīng)執(zhí)行代碼也不一樣:
(1)Query Type為Select Statement時,對應(yīng)執(zhí)行代碼為:
stmt?=?conn.createStatement();
ResultSet?rs?=?null;
rs?=?stmt.executeQuery(sql);
return?getStringFromResultSet(rs).getBytes(ENCODING);
(2)Query Type為Callable Statement時,對應(yīng)執(zhí)行代碼為:
CallableStatement?cstmt?=?getCallableStatement(conn);
int?out[]=setArguments(cstmt);
boolean?hasResultSet?=?cstmt.execute();
String?sb?=?resultSetsToString(cstmt,hasResultSet,?out);
return?sb.getBytes(ENCODING);
(3)Query Type為Update Statement時,對應(yīng)執(zhí)行代碼為:
stmt?=?conn.createStatement();
stmt.executeUpdate(sql);
int?updateCount?=?stmt.getUpdateCount();
String?results?=?updateCount?+?"?updates";
return?results.getBytes(ENCODING);
(4)Query Type為Prepared Select Statement時,對應(yīng)執(zhí)行代碼為:
PreparedStatement?pstmt?=?getPreparedStatement(conn);
setArguments(pstmt);
ResultSet?rs?=?null;
rs?=?pstmt.executeQuery();
return?getStringFromResultSet(rs).getBytes(ENCODING);
(5)Query Type為Prepared Update Statement時,對應(yīng)執(zhí)行代碼為:
PreparedStatement?pstmt?=?getPreparedStatement(conn);
setArguments(pstmt);
pstmt.executeUpdate();
String?sb?=?resultSetsToString(pstmt,false,null);
return?sb.getBytes(ENCODING);
(6)Query Type為Rollback時,對應(yīng)執(zhí)行代碼為:
conn.rollback();
return?ROLLBACK.getBytes(ENCODING);
(7)Query Type為Commit時,對應(yīng)執(zhí)行代碼為:
conn.commit();
return?COMMIT.getBytes(ENCODING);
(8)Query?Type為AutoCommit(false)時,對應(yīng)執(zhí)行代碼為:conn.setAutoCommit(false);
return?AUTOCOMMIT_FALSE.getBytes(ENCODING);
(9)Query?Type為AutoCommit(true)時,對應(yīng)執(zhí)行代碼為:
conn.setAutoCommit(true);
return?AUTOCOMMIT_TRUE.getBytes(ENCODING);
(10)其它情況直接拋異常:throw new UnsupportedOperationException("Unexpected?query?type:?"+_queryType);四、JDBC Request參數(shù)化
方法(一):自定義用戶變量,然后進行引用
1.在Test Plan界面User Defined Variables中定義需要的變量

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

方法(二):在被執(zhí)行的SQL語句中使用“?”作為占位符,并傳遞參數(shù)值和參數(shù)類型。
其中,傳遞的參數(shù)值有常量和變量之分。
1.當(dāng)傳遞的參數(shù)值是常量時,如下圖所示,傳入的用戶ID和用戶號碼:

2.當(dāng)傳遞的參數(shù)值是變量時,如下圖中的${user_id}:

五、Variables names參數(shù)使用方法
Variable names:保存sql語句返回結(jié)果的變量名,如果給這個參數(shù)設(shè)置了值,會保存sql
語句返回的數(shù)據(jù)和返回數(shù)據(jù)的總行數(shù)。
| id | name | phone |
| A_1 | Mike | C_1 |
| A_2 | Lucy | C_2 |
假如,sql語句返回2行,3列,且Variables names設(shè)置為A, ,C,那么如下變量會被設(shè)置為:
A_#=2 (總行數(shù)) A_1=第1列, 第1行 A_2=第1列, 第2行
C_#=2 (總行數(shù)) ? C_1=第3列, 第1行 C_2=第3列, 第2行
如果返回結(jié)果為0,那么A_#和C_#會被設(shè)置為0,其它變量不會設(shè)置值。
如果第一次返回6行數(shù)據(jù),第二次只返回3行數(shù)據(jù),那么第一次那多的3行數(shù)據(jù)變量會被清除。
可以使用${A_#}、${A_1}...來獲取相應(yīng)的值
我們以上面的數(shù)據(jù)庫為例,設(shè)置Variables names的值為p1、p2,并添加Debug Sampler
來查看輸出結(jié)果。根據(jù)數(shù)據(jù)庫的實際情況,我可以預(yù)期p1_#的值為22,p1_1的值為
e59af3ba1110f433bd2b0f4996011cab。


由執(zhí)行結(jié)果可以看出我的預(yù)期是正確的。
粉絲福利:108本java從入門到大神精選電子書領(lǐng)取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進入java1234官方微信群
感謝點贊支持下哈?

