You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter计数器生成重复值:无法实现Oracle序列式唯一ID

JMeter生成全局唯一ID(替代Oracle序列)的解决方案

问题根源

你使用的JMeter默认计数器如果勾选了Per Thread(每个线程独立计数),多线程并行时每个线程都会从初始值开始累加,必然生成重复ID,触发数据库唯一约束冲突。


解决方案

方案1:修改现有计数器为全局共享

  • 打开计数器配置,取消勾选Per Thread选项,让所有线程共用同一个递增序列。
  • 保持格式字符串为sb%08d,初始值设为10000001,递增步长1,这样每个请求都会拿到全局唯一的sbXXXXXXX格式ID。

方案2:使用__counter()内置函数

  • 在插入SQL中直接调用全局模式的__counter()函数,替代计数器元件:
    INSERT INTO your_table (id, ...) VALUES ('sb${__formatNumber(${__counter(FALSE,)},00000000,)}', ...)
    
    • FALSE表示全局共享模式,确保所有线程共用同一计数;__formatNumber用来补全数字部分的位数,保持sbXXXXXXX格式。

方案3:直接调用Oracle序列(最可靠)

  • 既然要模拟Oracle序列,直接在SQL中使用数据库自带的序列生成唯一值,完全由数据库保证唯一性:
    INSERT INTO your_table (id, ...) VALUES ('sb' || your_sequence.NEXTVAL, ...)
    
    • 这里your_sequence是你在Oracle中创建的序列名称,NEXTVAL会自动生成下一个唯一值,拼接前缀sb即可。

方案4:用UUID生成无冲突ID(无需连续序列时用)

  • 如果ID不需要连续递增,可使用__UUID()函数生成全局唯一标识:
    INSERT INTO your_table (id, ...) VALUES ('sb${__UUID()}', ...)
    
    • 优点是彻底避免重复,缺点是ID不是连续的数字序列。

验证建议

修改配置后先做小批量测试(比如2线程×10次循环),检查插入的ID是否唯一,确认没问题后再执行10线程×1000次的全量测试。

内容的提问来源于stack exchange,提问作者John Little

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:35:09