新闻详情

新闻详情

首页 / 资讯中心 / 详情

Jmeter连接数据库实战:从JDBC驱动配置到接口压测

发布时间:2026/10/1 11:27:23来源:尧图网络
Jmeter连接数据库实战:从JDBC驱动配置到接口压测
最近刚好在做一轮接口压测测试数据要从数据库里现取顺手把Jmeter连数据库的整套玩法整理了一遍。这东西说实话真不难网上教程也多但很多都只讲“点什么”不讲“为什么点”新手照着做一出问题就懵。这篇我就按自己实际操盘的顺序来写从驱动配置到JDBC Request实战再到各种翻车现场的排查方法全都过一遍。做接口测试、性能压测的朋友还有被测试数据准备搞得头疼的人这篇应该能帮你省不少事。1. 为什么压测要连数据库1.1 压测连接数据库的三个核心场景刚开始玩Jmeter的时候我也觉得连数据库是件挺绕的事后来才发现这步几乎是压测绕不开的刚需。最典型的使用场景就三个一是压测前准备测试数据比如要压一个订单接口你得先在库里造一批真实状态的订单数据拿SQL直接往库里插比手工去界面点快太多二是压测过程中拉取真实参数很多接口需要传用户ID、订单号、手机号这些动态值这些值从哪来从数据库查出来再传给HTTP请求比写死的数据真实得多三是压测后校验结果接口说是写成功了你怎么验证连上数据库查一下这条记录在不在、状态对不对比肉眼盯着响应结果要可靠得多。这三个场景只要沾上一个你就得学会在Jmeter里操作数据库。其实Jmeter连数据库的原理非常朴素通过JDBC驱动建立连接再靠JDBC Request这个Sampler发SQL本质上和你用Navicat连MySQL、用plsql连Oracle是一个道理只不过把查询动作搬到了压测脚本里。1.2 门槛比你想的低但有一个关键点必须搞懂先说结论Jmeter连接数据库不需要写任何代码。你没听错纯图形界面操作加两个组件、填几个参数就能跑起来。很多人被“JDBC”这三个字母吓住了觉得是Java程序员才干的事其实它就是一个通用接口规范Jmeter已经把底层封装好了你要做的只是告诉它驱动在哪、数据库在哪、SQL是什么。但有一个关键点必须搞懂那就是Variable Name变量名这个东西。Jmeter里面JDBC Connection Configuration负责创建连接池JDBC Request负责从这个连接池里取连接执行SQL。它们之间怎么对上号就是靠这个变量名。你配置元件里写的是db_testJDBC Request里的Variable Name也必须填db_test大小写都得一致一旦对不上报错信息会把你绕晕。这个设计很多新手第一次接触时完全没概念以为随便填个名字就行结果一跑就报Cannot get JDBC connection。我当时也是在这个坑里蹲了半天后来才算彻底明白这套对应关系。2. 环境准备Jmeter安装和数据库驱动配置2.1 装好Jmeter并确认JDK版本Jmeter本身是绿色软件解压就能用但前提是你机器上得有JDK。要提醒一下JDK版本和Jmeter版本是配套的Jmeter 5.x系列一般要求JDK 8以上你如果还在用JDK 7去跑新版Jmeter启动的时候就会有提示甚至直接起不来。我自己现在常用的是Jmeter 5.6.3配JDK 11跑起来很稳没必要追求最新的JDK 21LTS版本够用就行。装好之后命令行里执行jmeter -v能正常输出版本号环境就算就绪。Windows用户记住别双击Jmeter.bat那只是快速启动的批处理真正的入口是bin/jmeter.bat在bin目录下运行。如果你习惯用命令行压测后面生成报告的时候也会用到bin目录里的jmeter.bat路径问题提前记一下。2.2 数据库驱动Jar包这步最容易被忽略连接数据库必须要数据库驱动包。驱动这玩意儿相当于翻译官Jmeter说的话是JDBC标准方言MySQL听不太懂得靠驱动转成MySQL能理解的协议。不同的数据库对应不同的驱动数据库驱动类名典型Jar包MySQL 5.xcom.mysql.jdbc.Drivermysql-connector-java-5.1.x.jarMySQL 8.xcom.mysql.cj.jdbc.Drivermysql-connector-java-8.0.x.jarOracleoracle.jdbc.driver.OracleDriverojdbc8.jarPostgreSQLorg.postgresql.Driverpostgresql-42.x.jarSQL Servercom.microsoft.sqlserver.jdbc.SQLServerDrivermssql-jdbc-9.x.jar达梦dm.jdbc.driver.DmDriverDmJdbcDriver18.jar我以最常用的MySQL为例说明。去MySQL官网下载mysql-connector-java-8.0.33.jar然后把这个jar包复制到Jmeter安装目录下的lib目录里重启Jmeter这一步就算完成了。这里有个很容易踩的坑Jmeter只认lib目录下的jar包。你手动在测试计划里引外部jar往往不生效我见过有人折腾半天ClassNotFound最后发现就是jar没放进lib目录。另外要注意MySQL官方版本的驱动类名变化。5.x版本和8.x版本的Driver类不是一个。如果你用的是MySQL 8.x驱动类要填com.mysql.cj.jdbc.Driver再填老的com.mysql.jdbc.Driver虽然有时候也不报错但会给你提示说要换成新的。既然都在配置界面了老老实实按版本填对才是省心打法。2.3 通过/opt模块验证驱动是否生效配置完驱动先别急着写SQL可以快速验证一下驱动是否被正确加载。方法很简单在测试计划里右键添加一个JSR223 Sampler语言选groovy写一行代码试试能不能加载ClassClass.forName(com.mysql.cj.jdbc.Driver) log.info(Driver loaded successfully)运行一下如果日志里没有报ClassNotFound说明驱动jar已经被Jmeter正确加载了。这一步看起来多余但能帮你把“驱动没放对”这个变量提前排除掉后面真正去填JDBC Connection Configuration的时候就算报错你心里也有底。3. JDBC Connection Configuration配置详解3.1 一步步添加配置元件驱动搞定之后在测试计划上右键添加 - 配置元件 - JDBC Connection Configuration。这就是Jmeter用来维护数据库连接池的地方。它的本质是帮你管理一堆数据库连接省钱省资源。打个比方你自己建连接就好比每次要用打印机都亲自去仓库搬一台出来用完再搬回去连接池则是办公室角落里常备的三台打印机谁要用谁拿用完放回原处效率完全不一样。添加完之后界面上一堆字段其中真正要关心的核心参数就五个我一个个说清楚Variable Name连接池的名字JDBC Request要通过这个名字找到这个连接池。建议起个见名知义的名字比如db_order不要起a、b这种。Database URLJDBC连接串格式是jdbc:mysql://主机IP:端口/数据库名?参数比如jdbc:mysql://192.168.1.100:3306/testdb。JDBC Driver Class上面表格里的驱动类名MySQL 8填com.mysql.cj.jdbc.Driver。Username / Password数据库账号和密码这个不需要多解释但注意密码框默认会把输入内容显示成明文建议操作时留意一下周围环境。3.2 URL参数里藏着哪些坑Database URL这个地方是雷区重灾区尤其MySQL。如果你用的是MySQL 8.x驱动连接串里最好带上时区和SSL相关的参数否则很可能报Communications link failure或者时区异常。我在实际项目中用的标准URL长这样jdbc:mysql://192.168.1.100:3306/testdb?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowMultiQueriestrue逐个解释一下这几个参数为什么不加不行serverTimezoneAsia/ShanghaiMySQL 8驱动要求显式指定时区不填它它默认拿JVM时区跟服务器对不上就报错。useSSLfalse本地测试环境没配SSL证书不关SSL有时候会握手失败压测环境通常也不需要加密连接直接关掉性能还好一点。characterEncodingutf8不带这个查询结果里有中文大概率乱码。allowMultiQueriestrue这个看需求如果一条JDBC Request里要连着执行多条SQL语句必须开这个参数不开会报语法错误。但注意这个参数会带来SQL注入面变大的隐患生产环境慎用。3.3 连接池参数怎么设置最合理配置元件里还有一组连接池参数Max Wait、Max Active、Initial Pool Size等等。这组参数很多人直接跳过不管其实能不能扛住并发就看这里。拿压测场景来说如果在线用户数1000你Max Active只设5那这1000个线程抢5个连接大部分时间都卡在等连接上面压测结果显然失真。我一般这么设Max Active比你的Jmeter最大并发线程数略大一点比如压200并发Max Active给100到200之间就行Initial Pool Size设为5或10就行反正压测时连接会动态创建Max Wait最大等待时间给个10000毫秒超过这个数还没拿到连接就直接报错总比无限等下去糊里糊涂要好。这里有个经验之谈连接池不是越大越好。数据库服务端对连接数是有上限的你一股脑把Max Active调到1000数据库那边大概率报Too many connections。压测机上连接数开太多还会把数据库本身拖垮导致压测结果根本没法看。要做高并发压测真正合理的做法是先在压测脚本里控制并发数连接池数量跟上即可别无脑疯狂加。4. JDBC Request实战从查询到参数化4.1 添加JDBC Request并执行查询配置元件就位后在需要执行SQL的地方右键添加 - Sampler - JDBC Request。进去之后第一个要填的还是Variable Name必须和配置元件里的完全一致这一点前面强调过了。紧接着是SQL Query区域这是你写SQL的地方。举个例子我要在压测订单详情接口前先查出来一批真实存在的订单号SQL可以这么写SELECT order_id FROM t_order WHERE order_status 1 LIMIT 10这里有个关键设置Query Type。默认是Select Statement只能跑能返回结果集的SQL。如果你要插数据、更新数据、删数据一定要把Query Type改成Update Statement否则Jmeter会直接报错。这个词儿很多人不看结果一个INSERT搞了半天怎么也跑不通最后发现问题就出在这非常冤枉。执行完后怎么看结果添加一个查看结果树监听器运行一次JDBC Request的响应数据里会列出查出来的每一行数据。这个结果可以直接肉眼确认方便排查SQL写得对不对。4.2 结合参数化实现动态查询只做固定查询肯定不够压测的时候经常要根据前面接口的返回值来查数据库。JDBC Request支持参数化你把SQL写成这样SELECT user_name FROM t_user WHERE user_id ?问号是占位符真正的值要填到下方的Parameter Values和Parameter Types里。比如你要用HTTP请求响应里提取出来的userId变量就在Parameter Values里填${userId}Parameter Types里填INTEGER。多个参数就用英文逗号分隔格式是${userId},${orderId}参数类型同理写INTEGER,VARCHAR。这里有个特别容易翻车的细节如果SQL里只有一个问号Parameter Values写一个值就行。如果一个问号对应多个值就不要再自己加多余逗号了。Jmeter处理参数时是按逗号切分的。我自己遇到过在参数值里带了逗号的坑后来统一要求参数值里绝对不允许出现逗号有就换变量或者转义。Parameter Types不填的话Jmeter会把所有参数当字符串处理绝大部分情况下也能跑通但遇到数字类型比较严格的时候就会出问题所以官方类型的填写不要懒。4.3 把查询结果作为变量供HTTP请求使用JDBC Request还有个非常香的能力把查询结果保存为变量。做法是在Variable Names里填变量名。查出来的第一列数据会按行存入你指定的变量比如填orderId那么第一行数据存入orderId_1第二行是orderId_2以此类推注意这个索引是字符串类型的变量。但如果查出来的不是单列比如你查的是SELECT order_id, user_id FROM t_order那么第二列会存成userId_1、userId_2。这个特性在接口压测里太实用了。我之前的做法是在setUp线程组里用JDBC Request查出100个订单号然后用一个循环控制器配合计数器依次把orderId_1到orderId_100取出来传给HTTP请求当参数。这样压测的每个线程拿到的都是真实订单号而不是一堆重复的测试数据压测结果的说服力完全不一样。4.4 JSR223断言与数据库结果校验连数据库除了准备数据之外最常见的用途就是校验数据。比如你压了一个注册接口跑完了要看数据库里到底有没有新增账号。JDBC Request查询完数据之后你用断言来处理这个结果。一个比较实用的方案是在JDBC Request后面加一个JSR223断言用groovy把查到的结果拿来做判断。代码大致长这样import java.sql.* def result vars.get(rowsAffected) if (result null || result.isEmpty()) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage(Database returned no results) } else { log.info(DB result: result) }groovy在Jmeter 5.x版本里是内置支持的不需要额外装插件。这里vars.get拿到的是你之前填的Variable Names对应的值。你要注意Result variable name这个字段如果你在JDBC Request里填了它查询结果就会被存成一个对象集合在groovy里可以做更复杂的数据处理。比如查出来一批订单用循环遍历判断状态码过滤出非法的值这种玩法比单纯用响应断言高级很多也比较贴近真实业务校验场景。5. 实操场景压测数据准备与环境隔离5.1 用setUp线程组批量造测试数据做压测总得先有数据。手插数据太低效用Jmeter批量造数据是我最常用的姿势。具体做法是加一个setUp线程组在正式线程组跑之前让所有测试数据先落库。这个线程组里放一个JDBC RequestQuery Type选Update StatementSQL写成批量插入的循环。比如写这样一个存储过程式的处理逻辑造1000个未支付订单。在Jmeter里实现的方式通常是配合循环控制器计数器从1跑到1000每跑一次执行一条INSERT订单号直接由计数器拼接出来。INSERT INTO t_order (order_no, user_id, order_status, create_time) VALUES (CONCAT(TEST, ${__counter(false)}), 10001, 0, NOW())这里${__counter}是Jmeter内置的计数器函数false参数表示不全局计数每个线程独立计数。造完数据正式压测就开始跑真实接口。压测结束之后你可以选择再放一个tearDown线程组用DELETE把造出来的测试数据清掉。这套“先造数据、压测、再清理”的流程能保证每次压测的数据环境是一致的压测结果才有可比性。5.2 多数据库环境下的JDBC多连接配置项目稍复杂一点就不会只连一个库。比如订单库和用户库是分开部署的压测脚本里要同时操作两个库。这种场景的解法很简单加两个JDBC Connection ConfigurationVariable Name分别设为db_order和db_user然后在各自的JDBC Request里引用对应的名字即可。不要试图在一个配置元件里塞两个数据库Jmeter不干这事的。还有个小提醒多套连接池在一个测试计划里内存开销会明显上升你如果要压很高的并发建议把不用的JDBC Request用启用/禁用按钮先关掉跑到需要这个库的场景再临时打开免得白白占着连接池。5.3 事务提交与批量更新JDBC Request默认每个SQL是自动提交的如果你要在一个JDBC Request里执行多步更新并且希望它们要么全成功要么全失败那就要研究JDBC Connection Configuration里的Transaction isolation和Auto Commit了。把Auto Commit关掉之后你在一个JDBC Request里先执行UPDATE再执行INSERT数据库不会立即落盘直到你再次运行一个新的JDBC Request时Jmeter会提交上一个请求的事务。如果你中途把线程停了或者Sampler执行报错事务会回滚数据不会写进去。这个机制在清理数据场景里很好用如果你删除数据的SQL执行到一半发现有问题直接停掉线程组数据还原不会留下脏数据。不过要记得事务关闭会让性能下降压测核心链路时不建议开启。6. 经典报错清单与排查思路6.1 ClassNotFound与驱动类名错误ClassNotFound或者No suitable driver found这类报错十有八九是驱动jar没放进lib目录或者驱动类名填错了。我排查的顺序固定是三步先确认jar在不在lib目录再确认类名跟数据库版本匹不匹配最后重启Jmeter驱动加载只在启动时发生热插拔jar一般不生效。MySQL 5和MySQL 8的类名差别前面表格里写了踩坑的朋友请回去仔细核对一遍。6.2 Communications link failure和时区问题如果连接报Communications link failure注意观察报错尾部有没有带timezone字样。正常来说URL里死角serverTimezoneAsia/Shanghai都能解决。还有一种情况是网络不通数据库服务器防火墙挡住了压测机IP这种就只能找DBA或者运维开白名单了。压测前先拿客户端工具Navicat也好命令行也好手动连一下同一台数据库如果客户端都连不上那问题大概率不在Jmeter而在网络或数据库本身。我在实际项目里排查这类问题最快的方法是先在命令行里跑一下telnet 192.168.1.100 3306能通不能通一眼就能看出来省得在Jmeter界面里干瞪眼半天。6.3 中文乱码问题SQL查询结果里的中文变成一堆问号这情况只要在URL里显式加characterEncodingutf8就能解决。另外要注意Jmeter本身接收响应结果的编码设置在bin/jmeter.properties文件里搜sampleresult.default.encoding默认是ISO-8859-1改成UTF-8改完重启Jmeter。这两个地方都处理好了中文基本就不会出幺蛾子了。6.4 无法获取JDBC连接报错Cannot get JDBC connection或者说Connection is not available, request timed out这时候优先怀疑连接池参数和并发数的匹配关系。你把Max Active调大到比并发数更大情况一般会缓解。另外也要检查数据库本身的max_connections配置别让数据库把自己锁死了。压测性能测试的时候数据库连接数指标一定要盯住宁可压测结果不太理想也别把数据库搞挂掉不然生产环境会被你连带遭殃。6.5 Result variable name与变量作用域有人把JDBC Request的Result variable name填了之后在后面的HTTP请求的Body Data里引用${resultVar}结果发现拿到的是个对象内存地址。这是因为Result variable name存的是一个对象集合不是简单的字符串想用它必须走JSR223 Sampler或者BeanShell去解析。如果你只是想把查询结果的值传递给后面的接口直接用Variable Names里的下标变量比如像${orderId_1}这样用才是最省事的。这个区别很容易搞混属于“看起来应该行实测完全不行”的典型。6.6 SQL本身的问题还有一部分报错跟Jmeter半毛钱关系没有纯粹是SQL写错了。比如表名不存在、字段拼错、权限不够。这种问题的解法只有一个先拿客户端工具把这个SQL跑一遍通了再往Jmeter里搬。别在Jmeter里面猜错误拿着报错去对照数据库客户端执行结果定位速度快得很。Jmeter的报错信息里往往包含很详细的底层异常内容但很多人看到一长串IOException就慌了其实滚到最下面那一行才是真正的错误原因。7. 一点个人实操心得Jmeter连数据库这套东西难度真不高但细节确实多。我在实际项目里踩过最大的坑就是驱动jar忘记放lib目录以及Variable Name对不上这两个属于“配置层面”的问题排查起来最费时间。后面做熟了我现在几乎每个压测脚本都固定走一套流程先把连接池的URL和用户密码在客户端工具里验证一遍再在Jmeter里跑一个简单查询确认驱动OK然后才开始写复杂的SQL和断言。这个顺序能帮你把变量隔离开出问题的时候排查范围小很多。另外想多说一句连接数据库涉及到账号密码这些敏感信息Jmeter的jmx脚本是明文存储的千万别把带着生产库密码的脚本随手丢到代码仓库里去。我一般用一个jmeter.properties或者环境变量来动态读取数据库账号脚本里不写死密码。这种做法在团队协作的时候尤其重要防止误操作把压测脚本同步到公共仓库结果数据库口令也跟着泄露了。别图一时省事密码这事上马虎不得。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于Matlab的热电联产与风电联合优化调度:电锅炉与蓄热罐协同消纳弃风 2026/10/1 13:02:51

基于Matlab的热电联产与风电联合优化调度:电锅炉与蓄热罐协同消纳弃风

我国电力系统正面临一场深刻的供给侧变革,风电装机容量逐年攀升,但“弃风”问题却像一个挥之不去的阴影,尤其在北方采暖季尤为严重。一边是电网调峰能力不足,夜间风电大发时火电难以压出力;另一边是热电联产机组“以热…

阅读更多 →
NVIDIA驱动重装指南:nvidia-smi报错与Win/Linux排障 2026/10/1 13:02:51

NVIDIA驱动重装指南:nvidia-smi报错与Win/Linux排障

显卡驱动出问题这件事,经历过的人都知道有多崩溃:游戏帧数突然掉一半、桌面分辨率变得乱七八糟、开机直接黑屏,或者更典型的是在 Ubuntu 终端里敲nvidia-smi,回车后直接甩给你一句couldnt communicate with the nvidia driver。上…

阅读更多 →
Cursor 省下 7% 成本:Agent 底层脚手架的六处降本手术拆解 2026/10/1 13:02:51

Cursor 省下 7% 成本:Agent 底层脚手架的六处降本手术拆解

上个月底,我习惯性查了一下 Cursor 的用量账单,发现 Agent 相关的消耗比前一个月少了 7% 出头。一开始我以为是模型厂商调价,或者自己这个月活儿轻了,后来翻 release note 和本地日志,才意识到事情没那么简单——不是模…

阅读更多 →
JavaWeb学生信息管理系统课设:从源码环境配置到功能扩展的完整指南 2026/10/1 13:02:44

JavaWeb学生信息管理系统课设:从源码环境配置到功能扩展的完整指南

简介:这是一份JavaWeb课程设计期末大作业完整资源包,适合计算机相关专业学生完成学生信息管理系统项目、备战课程设计或毕设答辩。系统覆盖学生信息增删改查、成绩管理、科目管理、密码修改等典型模块,配套数据库SQL脚本与详细文档说明&#…

阅读更多 →
软件测试面试46题:从理论基础到自动化、接口与项目经验全解析 2026/10/1 13:02:44

软件测试面试46题:从理论基础到自动化、接口与项目经验全解析

金三银四又到了,团队最近在补测试岗,我一面下来看了几十份简历,也面了不下二十个候选人。发现一个挺普遍的现象:大家八股文背得溜,但问到“这个项目你为什么这么测”“漏测了你怎么复盘”,就开始含糊其辞。…

阅读更多 →
跨平台AI编程技能管理器:统一管理多工具Agent技能配置 2026/10/1 13:02:44

跨平台AI编程技能管理器:统一管理多工具Agent技能配置

1. 项目概述1.1 核心需求解析先把这个项目说清楚:Skills Manager,名字直译就是“技能管理器”,但它实际做的事情远不止“管理”两个字。它解决的是一个很具体的痛点——当你的电脑上装了 54 个以上 AI 编程工具(Cursor、Copilot、…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉