Jmeter JDBC Request 使用詳解
- 2020 年 10 月 10 日
- 筆記
- 【Jmeter】, JDBC Request
本篇博文講解以MySQL為例,搞懂JDBC Request中MySQL的使用方法,換成其它數據庫,
如Oracle、PSQL也會很容易上手。
一、基本配置
1.首先我們先了解一下,不同數據庫的驅動類和URL格式
Database | Driver class | Database URL |
MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host[![]() |
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包,如下圖所示:
二、配置JDBC Connection Configuration
JDBC Request經常需要配合配置元件JDBC Connection Configuration一起使用,先來看
一下JDBC Connection Configuration的相關配置。
這裡我們主要關注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
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語句返回的結果
我們添加一個監聽器,保存腳本運行一次,查看執行結果。
需要注意的是,Query Type不同時,對應執行代碼也不一樣:
(1)Query Type為Select Statement時,對應執行代碼為:
stmt = conn.createStatement(); ResultSet rs = null; rs = stmt.executeQuery(sql); return getStringFromResultSet(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); return sb.getBytes(ENCODING);
(3)Query Type為Update Statement時,對應執行代碼為:
stmt = conn.createStatement(); stmt.executeUpdate(sql); int updateCount = stmt.getUpdateCount(); String results = updateCount + " updates"; return results.getBytes(ENCODING);
(4)Query Type為Prepared Select Statement時,對應執行代碼為:
PreparedStatement pstmt = getPreparedStatement(conn); setArguments(pstmt); ResultSet rs = null; rs = pstmt.executeQuery(); return getStringFromResultSet(rs).getBytes(ENCODING);
(5)Query Type為Prepared Update Statement時,對應執行代碼為: PreparedStatement pstmt = getPreparedStatement(conn); setArguments(pstmt); pstmt.executeUpdate(); String sb = resultSetsToString(pstmt,false,null); return sb.getBytes(ENCODING);
(6)Query Type為Rollback時,對應執行代碼為: conn.rollback(); return ROLLBACK.getBytes(ENCODING);
(7)Query Type為Commit時,對應執行代碼為: conn.commit(); return COMMIT.getBytes(ENCODING);
(8)Query Type為AutoCommit(false)時,對應執行代碼為:conn.setAutoCommit(false); return AUTOCOMMIT_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中定義需要的變量
2.在JDBC Request界面SQL Query輸入框中以${變量名}的形式引用變量
方法(二):在被執行的SQL語句中使用「?」作為佔位符,並傳遞參數值和參數類型。其中,
傳遞的參數值有常量和變量之分。
1.當傳遞的參數值是常量時,如下圖所示,傳入的用戶ID和用戶號碼:
2.當傳遞的參數值是變量時,如下圖中的${user_id}:
五、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.apache.org/usermanual/build-db-test-plan.html