------ MySQL 查询结果提取为变量并在后续请求中复用
一、应用场景
在性能/接口测试中,JMeter 直接访问数据库非常常见,典型场景有三类:
-
参数化数据源:把数据库里的用户、商品、订单等数据读出来,作为请求参数的来源;
-
结果校验:请求执行后查询数据库,断言数据是否正确落库(接口与库一致性);
-
造数与清理:测试前准备数据、测试后清理数据。
本文以 MySQL 为例,完整演示"连接数据库 → 执行查询 → 把结果取成变量 → 在后续请求中复用"的全过程。
二、前置准备
2.1 准备 JDBC 驱动
JMeter 本身不带数据库驱动,需要把对应数据库的 JDBC 驱动 jar 放入 JMeter 的 lib 目录,重启 JMeter 后生效。本文使用 MySQL Connector/J(jar 已放入 %JMeter%/lib/):
|--------|------------------------------------------------|
| 项目 | 取值 |
| 驱动 jar | mysql-connector-j-26.7.0.jar(放入 %JMeter%/lib/) |
| 驱动类名 | com.mysql.cj.jdbc.Driver |
| 数据库 | MySQL 8.1(127.0.0.1:3306) |
2.2 准备测试数据表
为了演示,先在 MySQL 中建立一个库和表,并插入三条记录:
CREATE DATABASE IF NOT EXISTS jmeter_demo CHARACTER SET utf8mb4;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50), password VARCHAR(50), role VARCHAR(20));
INSERT INTO users (username,password,role) VALUES
('alice','pass_alice','tester'),
('bob','pass_bob','tester'),
('carol','pass_carol','admin');
三、第一步:添加 JDBC Connection Configuration (连接池配置)
在线程组上右键 → Add → Config Element → JDBC Connection Configuration。它负责建立数据库连接池,所有 JDBC Request 都通过它来取连接。

图 1 : JDBC Connection Configuration 连接池配置
|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------|
| 字段 | 取值 | 说明 |
| Variable Name for created pool | jmeter_pool | 连接池的变量名,后续 JDBC Request 靠它引用该池 |
| Database URL | jdbc:mysql://127.0.0.1:3306/jmeter_demo?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8 | JDBC 连接串 |
| JDBC Driver class | com.mysql.cj.jdbc.Driver | 驱动类全名 |
| Username / Password | root / root | 数据库账号密码 |
| Max Number of Connections | 10 | 连接池最大连接数 |
四、第二步:添加 JDBC Request (执行 SQL )
在线程组上右键 → Add → Sampler → JDBC Request。配置要执行的 SQL,并指定如何取值:

图 2 : JDBC Request 查询用户( Select 语句 + 取值配置)
|-----------------------|------------------------------------------------------------------------------------|------------------------|
| 字段 | 取值 | 说明 |
| Variable Name of Pool | jmeter_pool | 引用第三步配置的连接池名,必须一致 |
| Query Type | Select Statement | 普通查询用 Select Statement |
| SQL Query | SELECT id, username, password FROM users WHERE role = 'tester' ORDER BY id LIMIT 1 | 查询语句 |
| Variable Names | id,username,password | 把各列取为变量(重点) |
| Result variable name | userRows | 把整个结果集存为一个变量 |
五、第三步:把查询结果取成变量(核心)
5.1 Variable Names :按列取值
当 Variable Names 填 id,username,password 时,JMeter 会按列的顺序把每一行结果取成变量,命名规则为:
|--------------------------------|---------------------|------------------------|
| 变量 | 含义 | 本例取值 |
| id_1 / username_1 / password_1 | 第 1 行的三个列值 | 1 / alice / pass_alice |
| id_2 / username_2 / password_2 | 第 2 行的三个列值(仅当返回多行时) | --- |
| id_# | 本次返回的行数 | 1 |
因此在本例中,可以直接用 {username_1} 引用查到的用户名 alice、用 {password_1} 引用密码。
5.2 Result variable name :整体结果集
若填写 Result variable name = userRows,则整个结果集被存为一个变量,可用 ${userRows_1} 取第 1 行,或配合 ForEach 控制器遍历。与 Variable Names 的区别:前者按列命名、便于直接引用;后者保存整表、便于遍历。
5.3 查看取到的变量
在线程组上右键 → Add → Sampler → Debug Sampler,勾选 "JMeter Variables",运行时即可在结果树中看到 id_1、username_1、password_1、id_# 等变量及其值。

图 3 : Debug Sampler 查看取到的变量
六、第四步:在后续请求中复用取到的值
新增第二个 JDBC Request,把上一步取到的 ${username_1} 作为查询条件,验证变量确实可用:
SELECT id, username FROM users WHERE username = '${username_1}'

图 4 :用 ${username_1} 作为条件的第二个 JDBC 请求
同理,在 HTTP 请求、CSV、断言等任意位置都可以用 {username_1}、{password_1} 引用数据库里取到的值。
七、运行与验证
使用非 GUI 模式执行脚本:
jmeter -n -t examples/jdbc-demo.jmx -l report/jdbc-result.csv
执行结果:3 个采样全部成功(失败率 0%)。关键证据如下------
|---------------------|---------------------------------------------------|---------------------------|
| 采样 | 返回内容 | 结论 |
| JDBC Request:查询用户 | id\tusername\tpassword\n1\talice\tpass_alice | 查询到 alice 一行 |
| JDBC Request:按变量再查询 | id\tusername\n1\talice | ${username_1} 生效,命中 alice |

图 5 :查看结果树( JDBC 返回的数据库记录)

图 6 :聚合报告(采样统计)
八、常见问题( FAQ )
|---------------------------------------------|---------------------------------------------------------------------------------|
| 问题 | 原因与解决 |
| ClassNotFoundException / No suitable driver | 驱动 jar 未放入 %JMeter%/lib 或未重启 JMeter;或驱动类名写错(MySQL 8 用 com.mysql.cj.jdbc.Driver) |
| 时区报错 The server time zone value ... | URL 加 serverTimezone=Asia/Shanghai |
| Public Key Retrieval is not allowed | URL 加 allowPublicKeyRetrieval=true(且 useSSL=false) |
| 中文乱码 | URL 加 characterEncoding=UTF-8,并把库/表/连接字符集设为 utf8mb4 |
| Variable Name of Pool 报错找不到池 | JDBC Request 的池名必须与 JDBC Connection Configuration 的池变量名完全一致 |
| Variable Names 与 Result variable name 混淆 | 前者按列取值(username_1);后者保存整表(userRows),二者可同时使用 |
九、配套文件
|--------------------------|------------------------------------|
| 文件 | 说明 |
| examples/jdbc-demo.jmx | 本文完整测试计划(连接池 + 两次查询 + Debug + 监听器) |
| report/jdbc-result.csv | 执行结果原始数据 |
| report/jdbc-html-report/ | JMeter HTML 可视化报告 |
| JMeter连接数据库并取值教程.docx | 本文档 |