如何在JMeter中将数据库列100行数据存储到变量并跨线程使用
解决JMeter中JDBC查询结果全量存储与跨线程共享问题
你的问题出在每次循环都用新值覆盖了同一个ContractNumber变量,所以最终只保留了最后一行数据。以下是修正后的脚本,能把指定列的所有值存入集合,同时支持跨线程使用:
脚本实现(JSR223元素中执行)
// 初始化列表存储所有ASSET_NUM值 def allAssetNumbers = [] // 获取JDBC请求返回的结果集合(对应你设置的Result variable name: AccountNumber) def jdbcResults = vars.getObject("AccountNumber") // 遍历结果集,提取目标列的值 jdbcResults.each { row -> def assetNum = row.get("ASSET_NUM")?.toString() if (assetNum) { allAssetNumbers.add(assetNum) log.info("已收集ASSET_NUM: ${assetNum}") } } // 1. 存入线程局部变量(当前线程组内可用) vars.putObject("AllAssetNumbers", allAssetNumbers) // 2. 存入全局属性(跨线程组共享) props.put("GlobalAllAssetNumbers", allAssetNumbers)
使用方式
线程组内调用
在当前线程组的其他元素中,可通过以下方式获取集合中的值:
- 脚本中获取整个集合:
vars.getObject("AllAssetNumbers") - 用Groovy函数取指定索引的值(比如第1个元素):
${__groovy(vars.getObject("AllAssetNumbers").get(0),)}
跨线程组调用
在其他线程组中,通过全局属性获取集合:
- 脚本中获取整个集合:
props.get("GlobalAllAssetNumbers") - 用Groovy函数取指定索引的值:
${__groovy(props.get("GlobalAllAssetNumbers").get(ctx.getThreadNum()),)}
注意:如果用线程号作为索引,需确保线程数不超过集合的元素数量,避免数组越界。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

