JMeter压测存储过程90%结果不可信,因未用Callable Statement配对、语法格式错误(如缺大括号、加分号)、参数类型不匹配或连接池变量名大小写不一致,导致ORA-00900、ORA-01008等报错或隐式转换,无法真实反映执行路径。

直接用 JMeter 调 CALL 语句压测存储过程,90% 的结果不可信——不是数据库慢,而是你根本没测到真实执行路径。
Callable Statement 必须配对,否则 Oracle 报 ORA-00900
很多人把存储过程当普通 SQL 写进 JDBC Request,Query Type 选了 SELECT Statement 或 Update Statement,一跑就崩。Oracle 不认这种写法,它只接受标准 JDBC Callable 语法。
-
Query Type必须选Callable Statement,不能改 -
Query格式必须是{call schema.package_name.procedure_name(?, ?, ?)},开头结尾大括号不能少,结尾不能加分号,也不能写成BEGIN ... END或EXEC - 如果存储过程在 package 里,必须写全名,比如
{call mypkg.order_submit(?, ?)},漏掉mypkg.就报ORA-06576: not a valid procedure or function name
Parameter Types 错一位,就会隐式转换或 ORA-01008
参数值(Parameter Values)和类型(Parameter Types)必须严格一一对应,顺序、数量、类型三者缺一不可。JDBC 驱动不会帮你猜类型,填错就触发隐式转换,轻则执行计划漂移,重则直接报错。
-
VARCHAR2→ 填java.sql.Types.VARCHAR,不是CHAR或OTHER -
NUMBER→ 填java.sql.Types.NUMERIC,不是INTEGER(除非明确是整型) -
DATE→ 填java.sql.Types.DATE,用字符串传会走隐式转换,执行计划可能失效 - OUT 参数也要占位,哪怕你不用,
Parameter Types里得写java.sql.Types.VARCHAR,否则报ORA-01008: not all variables bound
Variable Name of Pool 大小写敏感,连不上就是它
JDBC Connection Configuration 里设的 Variable Name for created pool,和每个 JDBC Request 里的 Variable Name of Pool 必须完全一致——包括大小写、下划线、空格。不一致就找不到连接池,日志里只打 Cannot get connection from pool,不告诉你哪错了。
- 推荐全小写+下划线,比如
oracle_pool_v2,避免大小写混淆 - 别用中文、短横线、点号,JMeter 解析会出问题
- 多个线程组共用一个连接池时,这个变量名是唯一绑定点,写错一个地方,整个并发就串了
并发上不去?先查 Oracle 的 processes 和 JMeter 的 Ramp-Up
压到 50 线程就卡住,TPS 不涨,大概率不是 DB 慢,而是资源被掐住了脖子。
- Oracle 侧:检查
processes参数,200 并发至少设processes=250,否则新连接直接被拒,JMeter 日志里只显示超时 - JMeter 侧:确认
Ramp-Up Period是 1 秒以内,否则你以为的“200 并发”其实是 200 秒内慢慢加,稳态压根没出现 - 驱动版本别混用:
ojdbc8.jar对 Oracle 11g 有兼容问题,调用带 OUT 参数的 SP 会静默失败;11g 就用ojdbc6.jar
最常被忽略的点:存储过程内部是否显式提交事务。没 COMMIT 或 ROLLBACK,锁就一直挂着,高并发下第一个请求卡住,后面全排队——现象是响应时间突增、AWR 里 enq: TX - row lock contention 暴涨,但 JMeter 报表里只显示“平均响应时间 2s”,看不出锁在哪。


















