一、基本配置
1.首先我们先了解一下,不同数据库的驱动类和URL格式
2.将MySQL的JDBC驱动jar包复制到Jmeter的lib目录下,本文中使用的是 mysql-connector-java-8.0.16.jar
或者在Jmeter的Test Plan中直接引入jar包,如下图所示:
MySQL驱动下载:https://mvnrepository.com/artifact/mysql/mysql-connector-java
二、配置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,结果如图正确~
附:SQL参数化
SQL参数化:
Parameter values:参数值
Parameter types:参数类型
1.使用变量
SELECT * FROM m_users WHERE id = ${id};
2.使用问号
SELECT * FROM m_users WHERE id = ? AND name = ? ;
Parameter values:10,shuzf
Parameter types:VARCHAR,VARCHAR
3.使用变量和问号
SELECT * FROM m_users WHERE id = ? AND name = ? ;
Parameter values:${id},shuzf
Parameter types:VARCHAR,VARCHAR
3.返回值取值
Variable names:保存sql语句返回结果的变量名
1.假如返回结果又三个字段,四条记录
Variable names:A,B,C //ABC表示每列
${A_#}、${B_#} 、${C_#} 取总行数4
${A_1} 取第1列第1行数据
${A_2} 取第1列第2行数据
${C_1} 取第3列第1行数据
${C_4} 取第3列第4行数据
Result variable name:创建一个对象变量,保存所有返回的结果
Result variable name:shuzf
获取具体值的方法:columnValue = vars.getObject("resultObject").get(0).get("shuzf");