当前位置 博文首页 > 繁华似锦Fighting:『动善时』JMeter基础 — 43、JMeter对数据库
提示:
关于JMeter如何连接MySQL数据库,前面文章已经详解的讲解过了。因为配置数据库连接是比较固定的步骤,这里就不重复讲解了。
本篇文章主要详细说明,使用
JDBC Request
组件,如何对数据库进行查询的各种操作。
JMeter中查询语句的操作步骤:
JDBC Connection Configuration
组件,配置数据库连接。JDBC Request
请求,编写SQL语句,使用参数化。即:在SQL Query
使用参数化变量。
在JMeter中,有两个地方可以设置“用户自定义变量”。
一种是“测试计划”界面中设置“用户自定义变量”。
一种是添加配置元件中的“用户自定义变量”。
我们以“测试计划”为例。如下图:
(1)在“测试计划”界面中设置“用户自定义变量”。
我们添加了一个自定义变量用户ID,如下图:
(2)在JDBC Request
界面的SQL Query
中,使用${变量名}
的方式进行引用。
Varíable Name
填写对应的数据库配置名称,与JDBC Connection Configuration
组件中的Varíable Name
对应。Query Type
:选择Select Statement
,因为我们只进行一条查询的SQL语句。${变量名}
方式引用参数化变量。如下图所示:
SQL Query
中使用占位符传递参数传递的参数值有常量和变量之分。
传递2个常量:用户ID=3,用户名=孙悟空。
需要注意:
Query Type
:需要选择Prepared Select Statement
。Parameter values
参数值和Parameter types
参数类型,都必须要填写(参数类型与表设计结构中的类型一致即可)。如果有多个占位符,就需要有多组数据,之间用逗号分隔。如下图所示:
也就是占位符所接收的参数是一个参数化变量。我们把对应常量的位置,变成参数化变量即可,其他同上。
如下图所示:
各种形式的参数化可以这样使用。关于参数化相关知识,前面文章有详细说明。
Variables names
参数的使用方法Variables names
参数的作用是,把SQL语句查询出来的数据保存到变量中。一般查询返回几个字段,就用几个变量来进行接收,不同的变量之间用逗号隔开。
JMeter官网给的解释是:如果给这个参数设置了值,它会保存SQL语句返回的数据和返回数据的总行数。
假如,SQL语句返回2行,3列的数据,且Variables names
中设置为A,B,C
,那么如下变量会被设置为:
A_#=2 # A列的总行数
A_1=3 # A列的第一个数据,也就是第1列, 第1行的数据
A_2=4 # A列的第二个数据,也就是第1列, 第2行的数据
B_#=2 # B列的总行数
B_1=sunwukong@1268.com # B列的第一个数据,也就是第2列, 第1行的数据
B_2=zhubajie@1268.com # B列的第二个数据,也就是第2列, 第2行的数据
C_#=2 # C列的总行数
C_1=孙悟空 # C列的第一个数据,也就是第3列, 第1行的数据
C_2=猪八戒 # C列的第二个数据,也就是第3列, 第2行的数据
说明:
- 如果返回结果为0,那么
A_#
和C_#
会被设置为0,其它变量不会设置值。- 如果第一次请求返回6行数据,第二次请求只返回3行数据,那么第一次那多的3行数据,在线程变量中会被清除。
- 可以使用
${A_#}
、${A_1}
来获取相应的值,作为参数化数据进行传递。- 可以添加
Debug Sampler
组件,来查看参数是否获取到了。
示例:
(1)JDBC Request
组件界面内容
在Variable names
中定义接收数据的变量名,多个变量名之间用逗号分隔。
如下图所示:
(2)查看结果
添加一个取样器Debug Sampler
用来查看输出的结果。(Debug Sampler
组件可以查看到JMeter脚本运行中所有的变量)
JDBC Request
请求结果,如下图所示:
查看Debug Sampler
中的输出结果,如下图所示:
我们从上图中可以看到,JMeter把从数据库中查询出来的数据,存储在线程变量中了。
提示:
A
代表第一列所有的数据,A_#
可以获取到第一列的行数。A_n
可以获得第一列第n行的数据。B
和C
的功能类似, 假如我们只需要第一列和第三列的数据,可以写成A,,C
,中间的,
不可以省略。
Result variable name
参数使用方法如果给这个参数设置值,它会创建一个对象变量,保存所有返回的结果。
示例:
(1)JDBC Request
组件界面内容
在Result variable name
中定义接收数据的变量名。
如下图所示:
(2)查看结果
添加一个取样器Debug Sampler
用来查看输出的结果。(Debug Sampler
组件可以查看到JMeter脚本运行中所有的变量)
JDBC Request
请求结果,如下图所示:
查看Debug Sampler
中的输出结果,如下图所示:
(3)数据处理
上面查看到的结果集,我们如何应用里面的数据呢?
我们可以创建一个BeanShell
取样器,也可以在JDBC Request
取样器下一级添加后置处理器BeanShell PostProcessor
组件。
在里边编写如下代码,来获取需要的指定数据,提供给后面的接口请求使用。
对象中具体数据的获取方法:
columnValue = vars.getObject("resultObject").get(0).get("Column Name")
以上我们就把Parameter values
、Parameter types
、Variable names
、Result variable name
的使用方式进行了说明。
在日常工作中,可以举一反三,灵活使用。
(1)The server time zone value
服务器时区异常
如果报错,如下:
Cannot create PoolableConnectionFactory (The server time zone value '?????????????????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
解决方法:数据库连接URL后面加 serverTimezone=GMT
或serverTimezone=GMT%2B8
,即可解决。
(2)执行多条SQL语句
执行多条SQL语句时,查询语句select
和update
、insert
语句不能在同一个JDBC Request
组件中执行。
当执行多条SQL 语句时,每条语句后面加;
。
并且在 Database URL
后增加一个参数allowMultiQueries=true
,否则将不能够执行多条语句,报错。
(3)更新操作中文乱码
需要在 Database URL
后增加一个参数characterEncoding=utf-8
,这样就可以解决更新操作时候的中文乱码了。
提示:一定要设置为UTF-8编码吗?不一定,要跟你的数据库的编码保持一致,就不会中文乱码了。
(4)Datebase URL
添加参数规则
Datebase URL
后增加参数,在dbname
后加?
,如有多个参数,每个参数用&
隔开,如:
jdbc:mysql://127.0.0.1:3306/guest?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
参考:https://www.cnblogs.com/linbo3168/p/6039489.html