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[

ebdd1c845cce76d022f08a14c4180716.gifport]/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包,如下图所示:

98a59ef1bfcf0b77aee616f60dc755d6.png

二、配置JDBC Connection Configuration

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

一下JDBC Connection Configuration的相关配置。

5e335ca3f53529be8f6115775aa7747b.png

这里我们主要关注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

387aff8ecc6693c309e685088a218ddf.png

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语句返回的结果

我们添加一个监听器,保存脚本运行一次,查看执行结果。

b6510edf9c8b6c170a4774191de99ae5.png

需要注意的是,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中定义需要的变量

c86e45cf67d5c1b707c1d12d55b8217b.png

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

1e2a463e17942feff0af6c64a73e8acf.png

方法(二):在被执行的SQL语句中使用“?”作为占位符,并传递参数值和参数类型。其中,

传递的参数值有常量和变量之分。

1.当传递的参数值是常量时,如下图所示,传入的用户ID和用户号码:

b9ae63c00b9c5adb912f40ebdeefc7c3.png

2.当传递的参数值是变量时,如下图中的${user_id}:

af052456746029bb6d59621aee72b490.png

五、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。

1227e24dbb37e024bc0dbd0424fae848.png

21aaddb92c4e530864772c7b99728886.png

由执行结果可以看出我的预期是正确的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值