1、JDBC Request组件介绍
JDBC Request
组件可以向数据库发送一个JDBC请求(发送SQL语句),它需要和配置元件中的JDBC Connection Configuration
组件配合使用。
即:在使用JDBC Request
组件时,必须设置一个JDBC连接配置元件,以提供连接的目标数据库。
2、JDBC Request组件界面详解
添加JDBC Request
组件操作:选中“线程组”右键 —> 添加 —> 取样器 —> JDBC Request
。
JDBC Request
组件的界面,如下图所示:
界面详细说明:
-
名称:
JDBC Request
组件的自定义名称,见名知意最好。 -
注释:即添加一些备注信息,对该
JDBC Request
组件的简短说明,以便后期回顾时查看。
(1)Variable Name Bound to Pool
:绑定一个数据库的链接。
Variable Name of Pool declared in JDBC Connection Configuration
:填写数据库连接池的名称。也就是填写与你需要调用的jdbc connection configuration
组件中定义的变量名(Variable Name
)保持一致。
(2)SQL Query
:SQL查询
-
Query Type
:选择SQL语句类型。不同形式的SQL语句,需要选择对应的SQL语句类型。(具体介绍看下面补充) -
Query:
:里面填入查询数据库数据的SQL语句(填写的SQL语句时,单条SQL语句末尾不要加;
,多条SQL语句需要加;
)
(3)第三部分内容
-
Parameter values
:填写参数值。表示我们要添加到SQL中的数据(SQL语句中有占位符的时候使用),需要添加不同数据的时候,可以使用参数化。多个参数用逗号分隔。 -
Parameter types
:填写上面数据的参数类型,与上面的参数一一对应。比如varchar
、tinyint(m)
、smallint(m)
等。填写多个类型的时候,用逗号分隔。 -
Variable names
:保存SQL语句返回结果的变量名,与数据库字段对应,多个字段保存时,用逗号分隔。用于保存由Select语句、Prepared Select语句或CallableStatement返回的值(查询语句)。
注意,当与CallableStatement一起使用时,变量列表的顺序必须与调用返回的OUT参数相同。如果变量名少于OUT参数,则只有指定变量名的部分能返回;如果存在更多的变量名,则多余变量将被忽略。 -
Result variable name
:创建一个对象变量,保存所有返回结果。也就是定义用于存放select操作返回的查询结果集。 -
Query timeout
:设置查询超时的时间。 -
Handle result set
:定义如何处理由callable statements
语句返回的结果。(在涉及存储过程的时候可能会用上)-
Store As String
(默认):所有变量都作为字符串格式进行存储。不会遍历ResultSet。 -
Store As Object
:变量名称列表中的ResultSet类型的变量将被存储为对象。不会遍历ResultSet。 -
Count Records
:结果集类型的变量将通过显示记录的计数作为结果进行迭代。变量将被存储为字符串。
-
说明:
Parameter values
和Parameter types
:是成对出现的,且SQL语句中有多少个?
,这里就必须有多少对参数键值对。假设SQL语句为select * from member where id=2
,那么可以设置Parameter values
为${id}
,Parameter types
为int
。
3、补充:Query Type
类型说明
在JMeter的JDBC Request
组件中,Query Type
(SQL语句类型)包含十个类型,每个类型作用都不同。
(1)Select Statement(重点)
这是一个查询语句类型;如果JDBC Request
中的Query内容为一条查询语句,则选择这种类型。
提示:
- 如果有多条查询语句(不带有占位符的情况下),可以放在一起顺序执行,每天SQL语句用分号分隔,且需要设置
Query Type
为Callable Statement
。 - 执行多条查询语句时,如果
Query Type
选择为Select Statement
,只会执行第一条查询语句。 - 执行多条查询语句时,如果
Query Type
选择为Prepared Select Statement
,也只会执行第一条查询语句。
前提:在JMeter中执行多条查询语句时,需要在
JDBC Connection Configuration
组件中配置Database URL
添加?allowMultiQueries=true
,例如:jdbc:mysql://127.0.0.1:3306/ecshop4?serverTimezone=GMT&allowMultiQueries=true
。不填写,则会报错。
(2)Update Statement(重点)
这是一个更新语句类型,包含update
、insert
和delete
操作。如果JDBC Request
组件中的Query内容为一条更新语句,则选择这种类型。
提示:
- 如果执行多条更新语句(不带有占位符的情况下),可以放在一起顺序执行,每天SQL语句用分号分隔。
- 且
Query Type
设置为Update Statement
、Prepared Update Statement
和Callable Statement
都可以(亲测5.4.1版本)。 - 前提是
Database URL
添加了allowMultiQueries=true
参数,如上。 - 如果添加中文乱码,则需要在
Database URL
添加characterEncoding=UTF-8
参数。 - 如果多条语句中夹杂Select语句,则自动忽略。
- 多条语句中,若第一条语句为Select语句,则报错。
(3)Prepared Select Statement(重点)
Select Statement
用于为一条SQL语句生成执行计划,如果只执行一条查询SQL语句,Select Statement
是最好的类型。
Prepared Select Statement
用于绑定变量重用执行计划,对于多次执行的SQL语句,Prepared Select Statement无疑是最好的类型
生成执行计划极为消耗资源,两种实现速度差距可能成百上千倍。
提示:
Prepared Select Statement
的第一次执行消耗是很高的,它的性能体现在后面的重复执行。
总结:
Prepared Select Statement
是预编译的,对于批量处理可以大大提高效率。所以对于多条查询语句的执行,选择这个是最好的。
(4)Prepared Update Statement(重点)
Prepared Update Statement
和Prepared Select Statement
的用法是极为相似的,具体可以参照前三种类型的关系。
(5)Callable Statement
这是一个可调用语句类型,Callable Statement
为所有的 DBMS(数据库管理系统) 提供了一种以标准形式调用已储存过程的方法。
简单的理解:
- 也就是说如果需要调用存储过程就选这个这个类型。具体的使用,可以自行去拓展。
Callable Statement
语句类型,只要语法正确,任何语句,再多的条数都能支持。
(6)Commit
Commit
的意思是:将未存储的SQL语句结果写入数据库表,而在JMeter的JDBC请求中,同样可以根据具体使用情况,选择这种Query类型。(无特殊情况,不推荐使用)
(7)Rollback
Rollback
指的是:撤销指定SQL语句的过程,而在JMeter的JDBC请求中,同样可以根据需要使用这种类型。(无特殊情况,不推荐使用)
(8)AutoCommit(false)
MySQL默认操作模式就是AutoCommit
自动提交模式。表示除非显式地开始一个事务,否则每条SQL语句都被当做一个单独的事务自动执行。
我们可以通过设置AutoCommit
的值,改变是否执行自动提交模式。
而AutoCommit(false)
的意思是不执行自动提交模式,即将用户操作一直处于某个事务中,直到执行一条Commit
提交或Rollback
语句,才会结束当前事务,重新开始一个新的事务。
(9)AutoCommit(true)
这个选项的作用和上面AutoCommit(false)
作用相反,即:无论何种情况,都自动提交将结果写入数据库,并结束当前事务开始下一个事务。
(10)编辑(${}
)
如果需实现同时多个不同用户使用不同的SQL,可以通过把整条SQL语句参数化来实现。
把SQL语句放在CSV文件中,然后在JDBC Request
的Query中,使用参数化 ${SQL_Statement}
代替。