JMeter 连接数据库并取值(JDBC 实战)

------ MySQL 查询结果提取为变量并在后续请求中复用

一、应用场景

在性能/接口测试中,JMeter 直接访问数据库非常常见,典型场景有三类:

  1. 参数化数据源:把数据库里的用户、商品、订单等数据读出来,作为请求参数的来源;

  2. 结果校验:请求执行后查询数据库,断言数据是否正确落库(接口与库一致性);

  3. 造数与清理:测试前准备数据、测试后清理数据。

本文以 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 | 本文档 |

相关推荐
小羊没烦恼!2 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Rain的Java大神之路2 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
码途行者2 小时前
缓存一致性难题:Redis 和数据库如何做到数据一致?
数据库·redis
SelectDB2 小时前
Doris VARIANT 速查:类型映射、建表写法、索引配置与常见注意点
大数据·数据库·数据分析
l1t3 小时前
几种数据库软件count(distinct)和count()from group by子查询性能测试
开发语言·数据库
夜雪一千3 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
CJi0NG3 小时前
【自用】MySQL-存储引擎
数据库·mysql
weixin_460443563 小时前
在线考试人脸识别如何合规?本地活体检测、人脸模板加密与替代认证的技术架构设计
大数据·数据库·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统