JMeter:如何验证线程执行后JDBC连接的开闭状态?
问题分析与解决
你遇到的核心问题是:JSR223后置处理器里获取JDBC连接后未归还,导致连接池被耗尽,循环次数≥2时无法获取新连接,触发超时错误。
原因拆解
当调用org.apache.jmeter.protocol.jdbc.config.DataSourceElement.getConnection('ConnectionString')时,是从JMeter的JDBC连接池借出了一个连接,但你的脚本没有将连接归还回池。如果连接池最大连接数为默认的1(多数场景默认值),第一次循环借出连接后未归还,第二次循环时连接池无空闲连接,等待超时后就会抛出Cannot get a connection, pool error Timeout waiting for idle object错误。而移除后置处理器后,JDBC请求执行完毕会自动归还连接到池,所以多次循环能正常运行。
修复方案
修改JSR223后置处理器的脚本,在获取连接并验证状态后,必须归还连接到连接池,代码如下:
// 从连接池借出连接 def connection = org.apache.jmeter.protocol.jdbc.config.DataSourceElement.getConnection('ConnectionString') try { // 打印连接关闭状态 log.info('*************Connection closed: '+ connection.isClosed()) } finally { // 无论是否发生异常,都归还连接到池 org.apache.jmeter.protocol.jdbc.config.DataSourceElement.returnConnection('ConnectionString', connection) }
额外建议
如果你只是想验证JDBC请求执行后连接是否被正确归还,其实不需要手动获取连接:
- 开启JMeter的DEBUG级别日志(修改
log4j2.xml将org.apache.jmeter.protocol.jdbc的日志级别设为DEBUG),可以看到JDBC连接的借出、归还日志,直接确认连接状态。 - 通过JMeter的监控组件(如Backend Listener)采集连接池的指标(活跃连接数、空闲连接数),更直观地观察连接池状态。
内容的提问来源于stack exchange,提问作者Mannan Bahelim
相关产品推荐
相关产品推荐

