使用JMeter的JDBC请求取样器进行数据库性能测试,可以模拟高并发场景下的SQL执行效率是后端压测的步骤
1. 环境准备:放置数据库驱动
JMeter 不自带具体数据库的 JDBC 驱动,需手动下载并放入 lib 目录(推荐直接放 lib,也可放 lib/ext)。
MySQL:下载 mysql-connector-java-xxx.jar
PostgreSQL:下载 postgresql-xxx.jar
Oracle:ojdbc8.jar 等
放置后必须重启 JMeter,驱动才会生效。
2. 创建测试计划和线程组
右键测试计划 - 添加 - 线程(用户) - 线程组
设置线程数(并发用户)、Ramp-Up 时间、循环次数等,模拟压测场景。
3. 配置JDBC连接池
线程组内右键 - 添加 - 配置元件 -JDBC Connection Configuration
参数详解:
Variable Name for created pool:mydb (连接池变量名,后续 JDBC 请求要引用)
Database URL:jdbc:mysql://192.168.1.100:3306/mydb?useSSL=false&serverTimezone=UTC
JDBC Driver class:com.mysql.cj.jdbc.Driver (根据数据库选择)
Username / Password:数据库用户名和密码
连接池设置:
Max Number of Connections:池中最大连接数,建议 ≥ 并发线程数,避免等待
Max Wait (ms):获取连接超时时间,如 10000
Auto Commit:一般设为 true
Transaction Isolation:DEFAULT 即可
多个不同的数据库可配置多个连接池,用不同变量名区分。
4. 添加JDBC请求取样器
线程组内右键 - 添加 - 取样器 - JDBC Request
基本配置
Variable Name of Pool:填入上一步的变量名,如 mydb
SQL Query:填入要测试的 SQL 语句
Query Type:根据语句类型选择,会直接影响执行方式和结果处理
Query Type详解
Select Statement
执行单条 SELECT,返回结果集。适用于普通查询压测。
Update Statement
执行 INSERT / UPDATE / DELETE,返回受影响行数。适用于数据写入/更新压测。
Prepared Select Statement
使用 ? 占位符的预编译查询,需配合参数值和类型。可参数化、防注入、减少硬分析。示例:
SQL:SELECT * FROM users WHERE id = ? AND status = ?
Parameter values:${id}, 1
Parameter types:INTEGER, INTEGER
Prepared Update Statement
使用 ? 占位符的预编译更新,同样需要参数值和类型。如压测插入订单:
SQL:INSERT INTO orders (user_id, amount, order_time) VALUES (?, ?, ?)
Parameter values:${userId}, ${amount}, ${__time(yyyy-MM-dd HH:mm:ss,)}
Parameter types:INTEGER, DECIMAL, TIMESTAMP
参数值可用逗号分隔,支持 JMeter 变量或函数。参数类型必须和数据库列类型一致,常用:VARCHAR、INTEGER、BIGINT、DECIMAL、TIMESTAMP、DATE。如果省略类型,JMeter 会全部按 VARCHAR 处理,可能导致类型错误。
Callable Statement
调用存储过程,支持入参加出参。示例:
SQL:{call GetUserCount(?, ?)} (假设两个参数:入参状态,出参总数)
Parameter values:1, OUT
Parameter types:INTEGER, INTEGER
Commit / Rollback
手动控制事务,需要将 Auto Commit 设为 false。用于测试事务提交或回滚的性能。
Declare Statement
执行不返回结果的 DDL(如 CREATE TABLE),较少使用。
结果集处理
如果只做负载压测,不关心返回数据,可不设置 Result variable name,直接执行。
如果需要断言或提取返回值,可指定 Result variable name,如 myVar,然后通过后置处理器取值。
5. 处理查询结果和断言
提取列值
在 JDBC 请求中设置:
Variable names:id, name, email (逗号分隔,对应 SELECT 的列顺序)
执行后 JMeter 会生成 id_1、name_1、id_2… 等变量,可结合 ForEach 控制器 遍历多行,或直接使用 id_1 获取第一行第一列。调试时可添加 调试后置处理程序 查看所有变量。
添加响应断言
在 JDBC 请求上右键 - 添加 - 断言 - 响应断言。
测试方式可以检查响应数据中的受影响行数(如返回 1)或特定字符串。如果设置了 Result variable name,还可以用 BeanShell 断言编程判断,但一般响应断言已能满足需求。
6. 添加监听器观测性能
查看结果树:调试必备,可看到请求/响应数据和SQL异常信息
聚合报告:观察吞吐量(TPS)、平均响应时间、错误率
用表格查看结果:实时查看每次请求耗时
7. 执行和调优建议
连接池最大连接数必须 ≥ 并发线程数,否则线程会阻塞等待连接,导致TPS受限并可能超时。
对生产库压测必须谨慎,从低并发逐步增加,观察短板。
优先使用Prepared Statement,更真实模拟应用层行为,同时减少数据库硬分析。
测试写入场景时,注意数据量增长对索引的影响,可准备数据清理脚本。
如果参数化数据来自CSV,保证CSV文件不含列名行或已正确跳过,并在CSV Data Set Config中合理设置循环和结束方法。
按照以上流程就能完整地使用JDBC请求取样器对数据库进行性能压测了。