jmeter_操作数据库

JMeter 操作数据库(JDBC)

✅ 原理
JMeter 通过JDBC 驱动连接数据库,两个核心组件:

  1. JDBC Connection Configuration(配置元件):创建数据库连接池,填写数据库 IP、账号密码
  2. JDBC Request(取样器):编写 SQL,执行增删改查,两个组件的连接池变量名必须一模一样

最常用场景:

  • 接口测试前,查数据库获取验证码、账号数据(参数化)
  • 接口调用完成后,查询数据库校验数据是否入库(数据库断言)
  • 测试前清理 / 初始化测试数据

步骤

  1. 下载 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 添加。
image
image

  1. 添加 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 数据库密码

其余保持默认即可。

  1. 添加 JDBC Request 取样器
    右键线程组 → 添加 → 取样器 → JDBC Request
  • Variable Name Bound to Pool:mysqlPool(必须和上面完全相同)
  • Query Type:
    • Select Statement:查询 select
    • Update 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_# 返回总行数

  1. 引用数据库查询结果(和接口关联联用)
    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 数据库登录密码

image

✅ 重点

  • 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

⚠️ 踩坑

  1. 参数之间必须用 &,不能用&&、逗号
  2. MySQL8 缺少serverTimezone=Asia/Shanghai,直接连接失败,是高频报错点
  3. allowPublicKeyRetrieval=true仅学习测试使用,生产不要开,存在中间人攻击风险
  4. IP、端口、数据库名写错也会连不上;数据库需要开启远程访问权限(%账号)
  5. URL 里面不要有空格,空格直接导致连接异常

Jmeter txt文档参数化sql语句(CSV Data Set Config,最常用)

场景:txt 里面每行一条 SQL,JMeter 循环读取每行 SQL,放到 JDBC Request 执行。
适合批量执行多条 SQL:查询、新增、删除等。

完整步骤

  1. 新建txt文件【放在本地,路径不要中文,每行一条 SQL,不要 SQL 末尾分号】
select * from s
select * from temp
select * from db.s

⚠️注意:不要空行!不要多余换行;英文标点。

  1. 添加 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。

  1. JDBC Request 里面引用变量
    JDBC Request 的 Query 框,直接写变量:
${sql_str}

Query Type 根据 SQL 选:Select Statement查询 / Update Statement增删改。

JDBC Connection Configuration 还是你之前的 db 库配置。

  1. 线程组循环次数
    txt 里面一共 3 条 SQL → 线程组循环次数设置:3
    运行,察看结果树,会依次执行 txt 里 3 条 SQL。

常见坑

  1. ❌ 分隔符写错:默认逗号,,如果写逗号,一行 SQL 里有逗号就会被截断!读整条 SQL 必须用\n
  2. ❌ 文件路径有中文 / 空格,读取失败
  3. ❌ Recycle on EOF=True:读完文件从头无限循环,压测才开启,功能测试关闭
  4. ❌ 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,入门首选)

  1. 准备txt文档(放在本地,无中文路径)
  • 每行一条用户数据,逗号分隔多个字段
  1. 添加【CSV Data Set Config】配置元件(线程组下,JDBC 请求上方)【也可放在该JDBC下一级】
  2. JDBC Request 配置
    🌰 select * from s where id=${user_id} and username='${user_name}'
    ✅ 数字:${user_id} 不加引号
    ✅ 字符串:'${user_name}' 必须加单引号

末尾不要写;

  1. 线程组循环次数
    txt 一共几行数据,线程组循环次数就是几
    运行,每次循环自动读取一行用户数据,替换条件。

方案 2:Prepared 预编译参数化(企业推荐!防 SQL 注入,面试高频)

用?作为占位符,不在 SQL 里写 ${},参数写在下方 Parameter values
数据来源可以是txt文档,也可以是用户参数

JDBC Request 设置

  1. Query Type:Prepared Select Statement(预编译查询!重点)
  2. Query 框:
    select * from s where id=? and username=?

两个?,代表 2 个参数

  1. Parameter values:${user_id},${user_name}(和上面 CSV 变量一致,逗号分隔)
  2. Parameter types:INTEGER,VARCHAR(对应参数类型,id 是整数,username 字符串)

✅ 优点:

  1. 不用手动加单引号,自动处理字符串
  2. 防止 SQL 注入,生产压测必须用这种
  3. 字段带单引号的数据不会报错

方案 3:用户定义的变量 User Defined Variables(固定几组用户)

线程组添加【用户定义的变量】

  • 变量名:user_id,值:1
  • 变量名:user_name,值:zhangsan

🌰 select * from s where id=${user_id}

适合少量固定数据,不能循环读取多条。

⚠️高频踩坑点

  1. 字符串忘记加单引号:username=${user_name} → 直接报错,字符串必须'${user_name}'(方案 1 才需要,预编译方案 2 不用)
  2. txt 文件空行,会读到空数据
  3. 变量名大小写敏感,user_id和User_Id不一样
  4. 预编译模式:?数量必须和 Parameter values 参数数量完全一致
  5. 不要 SQL 末尾加分号

一句话:JDBC 条件参数化有两种方式:①CSV 读取 txt,在 SQL 中使用${变量}拼接条件,字符串字段需要手动添加单引号;②使用 Prepared 预编译语句,SQL 用?占位,参数填在下方 Parameter values,自动处理引号,防止 SQL 注入,推荐性能测试使用。

Jmeter 插入数据【修改/删除数据库数据同理】

数据来源可以是txt文档,也可以是用户参数

方案1:Prepared Update Statement(预编译插入 ✅推荐,防注入,不用手动加引号)

  1. 添加 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

  1. 设置线程组循环次数

方案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 注入风险,字符串内容带单引号会直接报错,只适合简单功能测试

⚠️高频踩坑点

  1. 主键重复报错:id 是主键,重复 id 插入会报 Duplicate entry,txt 里 id 不能重复
  2. 问号数量、Parameter values、Parameter types 三者数量、顺序必须完全一致
  3. 预编译模式,不要在 values 里面加单引号,pymysql/JDBC 自动处理字符串引号
  4. txt 不要有空行,空行会读到空值,插入失败
  5. 字段类型匹配:字符串用 VARCHAR,数字 INTEGER,日期 DATE

一句话:插入数据优先使用 Prepared Update Statement,SQL 用?占位;txt 通过 CSV Data Set Config 提供参数,在 Parameter values 填写变量列表,Parameter types 指定字段类型;相比直接拼接 ${变量},预编译可以防止 SQL 注入,自动处理字符串引号。

posted @ 2026-10-14 20:17  一只鹿吖  阅读(10)  评论(0)    收藏  举报