如何将JDBC查询结果传递至JMeter的另一个线程组?
解决JMeter跨线程组传递变量值的方案
方案一:全局属性+计数器+__property函数(修正原思路)
你之前用__setProperty无效,大概率是没把每个UCID单独存为全局属性,且跨线程组读取时混淆了变量和属性的区别。具体步骤:
- 在setUp线程组的JDBC请求中,将查询结果的变量名设为
UCID,JMeter会自动生成UCID_1、UCID_2…UCID_N的线程组内变量。 - 添加循环控制器,循环次数设为
${UCID_#}(即记录总数)。 - 循环控制器内添加JSR223 Sampler,将每个UCID存入全局属性:
int idx = Integer.parseInt(vars.get("__counter")); // 提前加一个计数器,变量名__counter,起始1,递增1 String ucid = vars.get("UCID_" + idx); props.put("UCID_" + idx, ucid);
- 同时在setUp线程组内用
__setProperty(totalRecords,${UCID_#})记录总条数,下一线程组循环次数设为${__P(totalRecords,0)}。 - 下一线程组内用
${__property(UCID${__counter(TRUE,)},)}逐个读取全局属性值(取代原__V函数,因为__V读取的是线程组私有变量,跨组要读全局属性)。
方案二:CSV文件中转
通过临时文件实现数据传递,适合数据量不大的场景:
- 在setUp线程组的JDBC请求后,添加JSR223 Sampler,将所有UCID写入CSV文件:
int total = Integer.parseInt(vars.get("UCID_#")); FileWriter writer = new FileWriter("ucids_temp.csv"); for(int i=1; i<=total; i++){ writer.write(vars.get("UCID_" + i) + "\n"); } writer.close();
- 下一线程组添加CSV Data Set Config:
- 文件名填
ucids_temp.csv - 变量名设为
currentUCID - 勾选“一次读取一行”,循环策略设为“循环到文件结束”
- 文件名填
- 下一线程组循环次数设为
${__P(totalRecords,0)},每次迭代即可通过${currentUCID}获取对应值。
方案三:全局列表存储(上下文共享)
利用JMeter上下文存储集合类,直接在内存中共享数据:
- 在setUp线程组的JDBC请求后,添加JSR223 Sampler,将所有UCID存入全局列表:
int total = Integer.parseInt(vars.get("UCID_#")); java.util.List<String> ucidList = new java.util.ArrayList<>(); for(int i=1; i<=total; i++){ ucidList.add(vars.get("UCID_" + i)); } ctx.getProperties().put("globalUCIDList", ucidList);
- 下一线程组添加计数器:起始值1,递增1,最大值设为
${__P(totalRecords,0)},变量名loopIdx。 - 下一线程组内添加JSR223 Sampler,取出对应索引的UCID:
java.util.List<String> ucidList = ctx.getProperties().get("globalUCIDList"); int idx = Integer.parseInt(vars.get("loopIdx")) - 1; // 列表索引从0开始 vars.put("currentUCID", ucidList.get(idx));
- 后续组件直接使用
${currentUCID}即可。
内容的提问来源于stack exchange,提问作者Enock Prince
相关产品推荐
相关产品推荐

