JMeter调用SQL Server带命名参数存储过程遇阻塞求助
解决JMeter调用SQL Server带命名参数存储过程卡住的问题
1. 确认JDBC连接配置正确性
- 驱动类必须使用SQL Server官方驱动:
com.microsoft.sqlserver.jdbc.SQLServerDriver - JDBC URL需适配驱动版本,新版驱动(mssql-jdbc 10+)需指定加密参数避免连接阻塞:
jdbc:sqlserver://你的服务器地址:1433;databaseName=DB_NAME;encrypt=false;trustServerCertificate=true - 确保
mssql-jdbc-x.x.x.jreX.jar驱动包已放入JMeter的lib目录,重启JMeter生效。
2. 修正存储过程调用写法
选择JDBC Request的Callable Statement类型,SQL语句采用SQL Server兼容的命名参数格式:
{call STORE_PROCEDURE_NAME (@param1=?, @param2=?, @param3=?, @param4=?, @param5=?, @param6=?)}
注:仅需写入必填参数和需要自定义的可选参数,未指定的可选参数将使用存储过程默认值。
3. 正确绑定参数
在JDBC Request的参数配置区按以下规则填写:
- Parameter names:填写不带
@的参数名,逗号分隔,例如:param1,param2,param3,param4,param5,param6 - Parameter values:对应参数值,逗号分隔,字符串加单引号、数值直接写,例如:
'val1','val2','val3',val4,val5,'val6' - Parameter types:对应SQL Server数据类型,逗号分隔,例如:
VARCHAR,VARCHAR,VARCHAR,INT,INT,VARCHAR
4. 排查存储过程阻塞问题
若配置无误仍卡住,在SQL Server执行以下查询检查会话阻塞情况:
SELECT session_id, blocking_session_id, wait_type, wait_time, sql_text = SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) FROM sys.dm_exec_requests qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st WHERE blocking_session_id <> 0;
若发现阻塞,终止阻塞会话或优化存储过程锁机制。
5. 其他注意事项
- 控制JMeter线程组并发数,避免超过SQL Server最大连接数限制
- 若存储过程含输出参数,需在
Parameter types中指定OUT类型 - 先在SSMS手动执行存储过程,确认执行正常且无性能问题
内容的提问来源于stack exchange,提问作者Pandarian Ld
相关产品推荐
相关产品推荐

