jmeter_操作数据库
JMeter 操作数据库(JDBC)
✅ 原理
JMeter 通过JDBC 驱动连接数据库,两个核心组件:
- JDBC Connection Configuration(配置元件):创建数据库连接池,填写数据库 IP、账号密码
- JDBC Request(取样器):编写 SQL,执行增删改查,两个组件的连接池变量名必须一模一样
最常用场景:
- 接口测试前,查数据库获取验证码、账号数据(参数化)
- 接口调用完成后,查询数据库校验数据是否入库(数据库断言)
- 测试前清理 / 初始化测试数据
步骤
- 下载 mysql 驱动jar包
- MySQL8:
mysql-connector-java-8.0.xx.jar - MySQL5:
mysql-connector-java-5.1.xx.jar
两种驱动类不一样: - MySQL5:
com.mysql.jdbc.Driver - MySQL8:
com.mysql.cj.jdbc.Driver
放到
jmeter/lib目录,重启 JMeter;或者在【测试计划】底部 Add jar 添加。
- 添加 JDBC Connection Configuration(线程组右键)
右键线程组 → 添加 → 配置元件 → JDBC Connection Configuration
作用:配置数据库连接池,管理数据库连接,供下方 JDBC Request 取样器调用
| 参数 | 填写示例(MySQL) |
|---|---|
| Variable Name Bound to Pool | mysqlPool(自定义,记住名字!JDBC Request 要和这个一致) |
| Database URL | jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai |
| JDBC Driver class | com.mysql.cj.jdbc.Driver(mysql8) |
| Username | root |
| Password | 数据库密码 |
其余保持默认即可。
- 添加 JDBC Request 取样器
右键线程组 → 添加 → 取样器 → JDBC Request
- Variable Name Bound to Pool:
mysqlPool(必须和上面完全相同) - Query Type:
Select Statement:查询 selectUpdate Statement:insert /update/delete(增删改都选这个)
- Query:写 SQL 语句,不要末尾加分号
select id,username from user where id=1
- Variable names:
user_id,user_name
👉 把查询结果存入 JMeter 变量
取出数据规则:
user_id_1第 1 行 id,user_name_1第 1 行 name;user_id_#返回总行数
- 引用数据库查询结果(和接口关联联用)
JDBC 查询拿到数据后,HTTP 接口直接用${user_name_1}引用。
典型流程:JDBC 查询获取账号 → HTTP 登录接口使用账号密码。
✅ Query Type 说明
- Select Statement:查询语句
- Update Statement:insert update delete
- Callable Statement:存储过程
- Commit:提交事务
- Rollback:回滚事务
✅ 数据库结果断言(校验数据)
JDBC 请求下面添加响应断言或者JSON 断言,校验查询结果是否符合预期。
例:查询返回用户名是否为 admin。
一句话:JMeter 操作数据库需要先导入 JDBC 驱动 jar 包;添加 JDBC Connection Configuration 配置数据库连接池;添加 JDBC Request 取样器编写 SQL 执行增删改查;两个组件的连接池变量名必须一致;查询结果可以保存为变量,实现数据库参数化,常用于接口前置取数据、后置校验数据库数据。
❌ 常见踩坑
- jar 包版本不对,驱动类写错,报驱动找不到
- 两个组件连接池变量名不一致,无法找到连接
- MySQL8 缺少时区参数
serverTimezone=Asia/Shanghai,连接报错 - SQL 末尾多加
;导致执行异常 - 数据库防火墙、账号远程访问权限没开,连不上库
JDBC Connection Configuration 参数详解
| 参数 | 示例值 | 详细解释 |
|---|---|---|
| Variable Name Bound to Pool | mysqlPool |
✅【最重要】连接池变量名,自定义后续 JDBC Request 取样器里,这个名字必须完全一模一样,大小写敏感!作用:多个 JDBC 请求共用这一个数据库连接池。多个数据库(比如同时连 mysql+oracle)就写不同名字,分开连接池。 |
| Max Number of Connections | 10 |
连接池最大连接数。性能测试并发用,一般写 10~20;功能调试写 1 即可。不能超过数据库本身最大连接限制。 |
| Max Wait (ms) | 10000 |
获取连接最大等待时间,单位毫秒。10000=10 秒。10 秒拿不到数据库连接就报错。 |
| Time Between Eviction Runs (ms) | 60000 |
空闲连接清理线程运行间隔,60000=60 秒。一般保持默认。 |
| Auto Evict? | ✅勾选 | 自动清理长时间空闲失效的数据库连接,推荐勾选。 |
| Min Idle Time (ms) | 600000 |
连接最小空闲时间,超过这个时间就会被回收。默认 600000(10 分钟)。 |
| Keep-Alive? | ✅勾选 | 保活机制,维持连接,防止长时间不用被数据库断开,推荐勾选。 |
| Test While Idle? | ✅勾选 | 空闲的时候自动测试连接是否有效,推荐勾选。 |
| Soft Min Evictable Idle Time(ms) | 5000 |
软空闲时间,一般默认不用改。 |
| Validation Query | select 1 |
校验连接是否存活的 SQL。MySQL 固定写select 1;Oracle 写select 1 from dual。不要修改。 |
| Database URL | jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true |
JDBC 连接地址格式:jdbc:mysql://数据库IP:端口/数据库名?参数参数说明:serverTimezone=Asia/Shanghai 设置时区(MySQL8 必须,否则报错)useSSL=false 关闭 SSL 加密,本地测试使用allowPublicKeyRetrieval=true 解决公钥报错 |
| JDBC Driver class | com.mysql.cj.jdbc.Driver |
JDBC 驱动类名称:✅MySQL8.x:com.mysql.cj.jdbc.Driver✅MySQL5.x:com.mysql.jdbc.Driver |
| Username | root |
数据库登录账号 |
| Password | 123456 |
数据库登录密码 |

✅ 重点
- Variable Name Bound to Pool 是核心,JDBC Request 必须填写相同名称,否则找不到连接池,报错。
- Database URL 里面的
serverTimezone=Asia/Shanghai是 MySQL8 必填参数,缺少会直接连接失败。- Driver Class 区分 MySQL5 和 MySQL8,版本写错,提示找不到驱动类。
- Validation Query 连接校验语句,MySQL 固定
select 1。
JDBC Database URL 完整讲解(MySQL,JMeter 使用)
基础格式:jdbc:mysql://数据库IP:端口/数据库名?参数1=值&参数2=值&参数3=值
?后面就是可选参数,多个参数用&拼接。
✅ 必掌握参数(JMeter 测试最常用,面试重点)
| 参数 | 可选值 | 作用说明 |
|---|---|---|
serverTimezone |
Asia/Shanghai / UTC |
⭐MySQL8 必须加! 指定时区。Asia/Shanghai = 北京时间 UTC+8;不写会报时区异常。MySQL5 不需要这个参数。 |
useSSL |
true / false |
是否使用 SSL 加密连接。本地测试环境写 false,关闭 SSL,减少报错;生产环境建议 true。 |
allowPublicKeyRetrieval |
true / false |
MySQL8 新认证插件caching_sha2_password会报公钥获取错误。测试环境填true;生产环境不建议开启(有安全风险)。 |
characterEncoding |
utf-8 |
指定字符集,解决中文乱码,查询中文数据必加。 |
useUnicode |
true |
开启 unicode 编码支持,配合 characterEncoding 使用。 |
✅ 拓展可选参数(了解即可)
| 参数 | 作用 |
|---|---|
autoReconnect=true |
连接断开后自动重连,长时间压测可以加上,防止连接断掉 |
maxReconnects=3 |
自动重连最大尝试次数 |
rewriteBatchedStatements=true |
批量插入时开启批量优化,大批量 insert 提升速度 |
zeroDateTimeBehavior=convertToNull |
数据库0000-00-00这种非法日期,转为 null,避免查询报错 |
📌 两套完整 URL 模板(直接复制到 JMeter)
- MySQL8(最常用,推荐 JMeter):
jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&characterEncoding=utf-8 - MySQL5.7(不需要 serverTimezone):
jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false&characterEncoding=utf-8
⚠️ 踩坑
- 参数之间必须用
&,不能用&&、逗号 - MySQL8 缺少
serverTimezone=Asia/Shanghai,直接连接失败,是高频报错点 allowPublicKeyRetrieval=true仅学习测试使用,生产不要开,存在中间人攻击风险- IP、端口、数据库名写错也会连不上;数据库需要开启远程访问权限(
%账号) - URL 里面不要有空格,空格直接导致连接异常
Jmeter txt文档参数化sql语句(CSV Data Set Config,最常用)
场景:txt 里面每行一条 SQL,JMeter 循环读取每行 SQL,放到 JDBC Request 执行。
适合批量执行多条 SQL:查询、新增、删除等。
完整步骤
- 新建txt文件【放在本地,路径不要中文,每行一条 SQL,不要 SQL 末尾分号】
select * from s
select * from temp
select * from db.s
⚠️注意:不要空行!不要多余换行;英文标点。
- 添加 CSV Data Set Config(配置元件)
右键线程组 → 添加 → 配置元件 → CSV Data Set Config
| 参数 | 填写示例 |
|---|---|
| Filename | D:\test\sql_list.txt(你的 txt 完整路径) |
| File encoding | UTF-8 |
| Variable names | sql_str(自定义变量名,存 SQL 语句) |
| Delimiter | \n 换行符(重点! 按一行读取一条 SQL) |
| Allow quoted data? | False |
| Recycle on EOF? | False(读完停止) |
| Stop thread on EOF? | True(读完文件,线程停止) |
| Sharing mode | All threads |
核心:
Delimiter填\n,代表换行作为分隔符,一行一条 SQL。
- JDBC Request 里面引用变量
JDBC Request 的 Query 框,直接写变量:
${sql_str}
Query Type 根据 SQL 选:Select Statement查询 / Update Statement增删改。
JDBC Connection Configuration 还是你之前的 db 库配置。
- 线程组循环次数
txt 里面一共 3 条 SQL → 线程组循环次数设置:3
运行,察看结果树,会依次执行 txt 里 3 条 SQL。
常见坑
- ❌ 分隔符写错:默认逗号
,,如果写逗号,一行 SQL 里有逗号就会被截断!读整条 SQL 必须用\n - ❌ 文件路径有中文 / 空格,读取失败
- ❌ Recycle on EOF=True:读完文件从头无限循环,压测才开启,功能测试关闭
- ❌ txt 编码 GBK,中文乱码,设置 UTF-8
备选方案:__StringFromFile 函数(不用 CSV 元件)
JDBC Request Query 直接写:${__StringFromFile(D:\test\sql_list.txt,,,)}
Jmeter 参数化sql里的值
需求:
select * from s where id=用户参数,每次循环读取不同用户 id / 用户名作为 where 条件
方案 1:变量拼接 SQL(简单,功能测试用)
方案 2:预编译 Prepared(推荐,防 SQL 注入,面试重点)
方案 1:CSV 文本参数化(读取 txt,${变量} 拼接 SQL,入门首选)
- 准备txt文档(放在本地,无中文路径)
- 每行一条用户数据,逗号分隔多个字段
- 添加【CSV Data Set Config】配置元件(线程组下,JDBC 请求上方)【也可放在该JDBC下一级】
- JDBC Request 配置
🌰select * from s where id=${user_id} and username='${user_name}'
✅ 数字:${user_id}不加引号
✅ 字符串:'${user_name}'必须加单引号
末尾不要写
;
- 线程组循环次数
txt 一共几行数据,线程组循环次数就是几
运行,每次循环自动读取一行用户数据,替换条件。
方案 2:Prepared 预编译参数化(企业推荐!防 SQL 注入,面试高频)
用
?作为占位符,不在 SQL 里写${},参数写在下方 Parameter values
数据来源可以是txt文档,也可以是用户参数
JDBC Request 设置
- Query Type:Prepared Select Statement(预编译查询!重点)
- Query 框:
select * from s where id=? and username=?
两个
?,代表 2 个参数
- Parameter values:
${user_id},${user_name}(和上面 CSV 变量一致,逗号分隔) - Parameter types:
INTEGER,VARCHAR(对应参数类型,id 是整数,username 字符串)
✅ 优点:
- 不用手动加单引号,自动处理字符串
- 防止 SQL 注入,生产压测必须用这种
- 字段带单引号的数据不会报错
方案 3:用户定义的变量 User Defined Variables(固定几组用户)
线程组添加【用户定义的变量】
- 变量名:
user_id,值:1 - 变量名:
user_name,值:zhangsan
🌰 select * from s where id=${user_id}
适合少量固定数据,不能循环读取多条。
⚠️高频踩坑点
- 字符串忘记加单引号:
username=${user_name}→ 直接报错,字符串必须'${user_name}'(方案 1 才需要,预编译方案 2 不用) - txt 文件空行,会读到空数据
- 变量名大小写敏感,
user_id和User_Id不一样 - 预编译模式:
?数量必须和 Parameter values 参数数量完全一致 - 不要 SQL 末尾加分号
一句话:JDBC 条件参数化有两种方式:①CSV 读取 txt,在 SQL 中使用${变量}拼接条件,字符串字段需要手动添加单引号;②使用 Prepared 预编译语句,SQL 用?占位,参数填在下方 Parameter values,自动处理引号,防止 SQL 注入,推荐性能测试使用。
Jmeter 插入数据【修改/删除数据库数据同理】
数据来源可以是txt文档,也可以是用户参数
方案1:Prepared Update Statement(预编译插入 ✅推荐,防注入,不用手动加引号)
- 添加 JDBC Request
- Query Type:Prepared Update Statement(插入 / 更新用这个!)
- Query(SQL 语句,
?占位符,末尾不要分号)
🌰 insert into s(id,name,age) values(?,?,?)
3 个问号,对应 3 个字段的值,顺序一一对应
- Parameter values:
${v_id},${v_name},${v_age}多个变量逗号隔开,不要加空格
- Parameter types:
INTEGER,VARCHAR,INTEGER依次对应:id 整型、name 字符串、age 整型
⚠️ JMeter JDBC 预编译参数类型必须写完整单词INTEGER
- 设置线程组循环次数
方案2:普通 Update Statement(直接 ${变量} 拼接,简单但不推荐)
Query Type:Update Statement
Query 框:
🌰 insert into s(id,name,age) values(${v_id},'${v_name}',${v_age})
⚠️字符串字段
name必须手动加单引号'${v_name}';数字不加引号。
风险:存在 SQL 注入风险,字符串内容带单引号会直接报错,只适合简单功能测试
⚠️高频踩坑点
- 主键重复报错:id 是主键,重复 id 插入会报
Duplicate entry,txt 里 id 不能重复 - 问号数量、Parameter values、Parameter types 三者数量、顺序必须完全一致
- 预编译模式,不要在 values 里面加单引号,pymysql/JDBC 自动处理字符串引号
- txt 不要有空行,空行会读到空值,插入失败
- 字段类型匹配:字符串用 VARCHAR,数字 INTEGER,日期 DATE
一句话:插入数据优先使用 Prepared Update Statement,SQL 用?占位;txt 通过 CSV Data Set Config 提供参数,在 Parameter values 填写变量列表,Parameter types 指定字段类型;相比直接拼接 ${变量},预编译可以防止 SQL 注入,自动处理字符串引号。



浙公网安备 33010602011771号