如何对JMeter的JDBC插入请求参数化,实现ID自增其余字段赋随机值
JMeter JDBC插入语句参数化实现方案
1 ID字段逐次自增实现
两种常用可落地方案,按需选择:
- 方案1:JMeter侧生成ID
直接调用JMeter内置函数${__counter(TRUE,)}即可实现自增:参数填TRUE代表每个虚拟用户单独计数,填FALSE代表全局统一计数。如果需要指定起始ID,可提前添加「用户定义的变量」配置组件,初始化id为指定起始值,再新增JSR223后置处理器,执行代码vars.put("id", String.valueOf(Integer.parseInt(vars.get("id")) + 1)),每次请求后自动累加ID值。 - 方案2:数据库侧生成ID
如果允许调整表结构,直接把id字段设置为AUTO_INCREMENT自增属性,SQL语句中直接省略id字段的插入赋值,数据库会自动生成不重复的自增ID,多线程并发场景下不会出现ID冲突,性能更好。
2 其余字段随机值生成
根据字段类型直接调用JMeter内置函数即可:
- 字符串类字段(business_center、item_group、attribute_group、modified_by)
需要固定前缀加随机后缀的场景,用${__RandomString(长度, 随机字符集,)},比如生成bc开头的4位随机后缀,写为bc${__RandomString(4,abcdefghijklmnopqrstuvwxyz0123456789,)}。
需要从预设可选值中随机选择的场景,用${__RandomFromMultipleVars(可选值1|可选值2|可选值3,)},多个可选值用竖线分隔即可。 - 时间类字段(created_on)
直接生成当前时间用${__time(yyyy-MM-dd HH:mm:ss,)};需要生成指定范围的随机时间,可拼接随机日期和随机时分秒:${__RandomDate(yyyy-MM-dd,起始日期,结束日期,,)} ${__Random(0,23,)}:${__Random(0,59,)}:${__Random(0,59,)}。
3 调整后示例SQL
insert into product.test (id,business_center,item_group,attribute_group,created_on,modified_by) values ( '${__counter(FALSE,)}', 'bc${__RandomString(4,abcdef0123456789,)}', 'ig${__RandomString(4,abcdef0123456789,)}', 'ag${__RandomString(4,abcdef0123456789,)}', '${__RandomDate(yyyy-MM-dd,2021-01-01,2021-12-31,,)} ${__Random(0,23,)}:${__Random(0,59,)}:${__Random(0,59,)}', 'Test${__Random(1,100,)}' );
4 并发场景注意事项
- 多线程压测如果选择JMeter侧生成ID,要使用全局计数的counter,或者用Counter配置组件,不要勾选「对于每个用户独立跟踪计数」,避免出现ID重复。
- 100线程以上的大并发场景,优先选择数据库自增ID方案,不需要额外处理ID冲突问题,执行效率更高。
内容的提问来源于stack exchange,提问作者dilRox
相关产品推荐
相关产品推荐

