JMeter JDBC请求Query Type实测(金仓数据库版)
文章目的
在实际性能测试中,JMeter的JDBC Request组件常用于模拟数据库操作。但许多用户对Query Type
参数的具体行为存在疑惑。
本文将以金仓数据库KingbaseES为例,通过实测验证每种Query Type
的行为,帮助用户明确其使用场景和限制,避免因配置不当导致测试结果失真。
一、测试环境准备
-
JMeter配置
- JMeter 5.3
- JDBC驱动:
kingbase8-9.0.0.jar
(放置于jmeter/lib/ext
目录)
-
数据库配置
- KINGBASE (KingbaseES) V009R001C002B0014
- 测试表结构:
CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR(50),status VARCHAR(20) DEFAULT 'active' ); insert into users(name) values ('user1'); insert into users(name) values ('user2');
-
JDBC连接配置
- Variable Name:
kingbase
- Database URL:
jdbc:kingbase8://192.168.17.12:54321/kingbase
- JDBC Driver Class:
com.kingbase8.Driver
- 用户名/密码:根据实际填写
- Variable Name:
二、测试用例与实测过程
1. Select Statement
- 测试目的
验证执行多条SELECT语句时是否仅返回第一条结果。 - 测试步骤
- 在JDBC Request中配置:
- Query Type:
Select Statement
- SQL Query:
数据库查询结果SELECT * FROM users WHERE status='active'; -- 表中有2条active数据 SELECT * FROM users WHERE status='deleted'; -- 表中有1条deleted数据
- Query Type:
- 在JDBC Request中配置:
- 添加
View Results Tree
查看响应。
这里发现直接报错
删除查询语句后面的分号,只保留第1条查询语句
结果显示正常
后面如果再加sql语句,会因为没有分号报语法错误
结论 Select Statement
仅可以执行一条SELECT语句
2. Update Statement
- 测试目的
验证执行多条DML语句时是否仅生效第一条。 - 测试步骤
-
初始化数据:清空
users
表,插入一条数据:INSERT INTO users (name) VALUES ('test_user');
-
配置JDBC Request:
- Query Type:
Update Statement
- SQL Query:
UPDATE users SET name='updated_user' WHERE id=1; DELETE FROM users WHERE id=1;
- Query Type:
-
- 执行后检查数据库数据。
-
执行结果
- 语句全部执行成功
- 语句全部执行成功
-
结论
Update Statement
可以执行多条DML语句。
3. Callable Statement
- 测试目的
验证是否支持执行多语句或调用存储过程。 - 测试步骤
- 创建PostgreSQL存储过程:
CREATE OR REPLACE PROCEDURE reset_users() AS
BEGIN
UPDATE users SET name='default';
DELETE FROM users WHERE status='deleted';
END;
2. 配置JDBC Request: - Query Type: `Callable Statement` - SQL Query: ```sqlcall reset_users(); -- 调用存储过程 SELECT * FROM users; -- 查询结果
执行前数据
3. 执行后检查数据库状态及响应数据。
-
执行结果
- 存储过程成功执行,所有用户name被重置为
default
。 - 响应数据中返回
SELECT
查询结果。
- 存储过程成功执行,所有用户name被重置为
-
结论
Callable Statement
支持多语句和存储过程调用。
4. Prepared Select Statement
-
测试目的
验证参数化查询是否生效,并支持重复执行。 -
测试步骤
- 配置JDBC Request:
- Query Type:
Prepared Select Statement
- SQL Query:
SELECT * FROM users WHERE id=?;
- Parameter Values:
${__Random(1,5)}
- Parameter Types:
INTEGER
- Query Type:
- 使用
${__Random(1,5)}
动态生成id值,循环执行2次。 - 检查每次查询是否返回匹配结果。
- 配置JDBC Request:
-
执行结果
- 每次均能根据动态id值返回对应数据(若存在)。
- 每次均能根据动态id值返回对应数据(若存在)。
-
结论
Prepared Select Statement
支持参数化,提升重复查询性能。
5. Commit与Rollback
-
测试目的
验证手动提交与回滚事务的功能。 -
测试步骤
添加配置:
第一个JDBC Request:AutoCommit(false)
sql
INSERT INTO users (name) VALUES (‘temp_user’);
第二个JDBC Request:Rollback
执行后检查数据库是否插入数据。 -
执行结果
执行后数据库无temp_user数据,回滚生效。 -
结论
通过Commit和Rollback可手动控制事务。
三、实测总结
Query Type | 支持多语句 | 适用场景 | 注意事项 |
---|---|---|---|
Select Statement | ❌ | 单次SELECT查询 | 仅首条生效 |
Update Statement | ✔️ | 多次INSERT/UPDATE/DELETE | 无 |
Callable Statement | ✔️ | 存储过程、多语句操作 | 语法需符合数据库规范 |
Prepared Statement | ❌ | 参数化重复查询或更新 | 必须定义参数类型 |
Commit/Rollback | - | 手动事务控制 | 需先关闭AutoCommit |
通过本次实测,可明确不同Query Type
的行为差异。建议在性能测试中优先使用预编译语句(Prepared Statement)提升效率,并合理利用事务控制保证数据一致性。