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

使用JOOQ存储记录时H2与MSSQL插入行为差异问题

问题原因
  • JOOQ会根据数据库原生语法特性生成适配SQL:H2支持SQL标准扩展的FINAL TABLE语法,插入后直接通过select "ID" from final table (insert into...)返回自增ID;而MSSQL无原生支持该语法,只能通过表变量(declare @result table)+INSERT+SELECT的组合逻辑实现返回生成ID的需求。
  • QuickPerf的@ExpectInsert/@ExpectSelect基于SQL语句类型统计:H2的写法会被识别为一条SELECT语句,MSSQL的写法会被统计为一条INSERT加一条SELECT,导致测试计数不一致。
可行解决办法

1. 调整JOOQ配置,禁用自动返回生成键

通过修改JOOQ配置或插入时显式指定,让JOOQ仅生成纯INSERT语句:

  • 全局配置:设置Settings.returnAllOnUpdatableRecord = false,关闭UpdatableRecord自动返回生成键的行为
  • 局部调用:使用insertInto(...).values(...).returningNothing()替代默认返回生成键逻辑,生成的SQL仅包含INSERT操作

2. 自定义QuickPerf的SQL统计规则

扩展QuickPerf的SQL解析逻辑,修正H2特殊语句的统计归类:

  • 实现自定义SqlStatementParser,将select ... from final table (insert ...)这类语句同时计入INSERT和SELECT计数,或直接归类为INSERT操作
  • 将自定义解析器注册到QuickPerf配置中,覆盖默认统计逻辑

3. 开启H2的MSSQL兼容模式

在H2连接URL中添加MODE=MSSQLServer参数,让H2模拟MSSQL语法:

  • 连接URL示例:jdbc:h2:mem:test;MODE=MSSQLServer;DB_CLOSE_DELAY=-1
  • 此时JOOQ会针对H2生成与MSSQL一致的表变量式SQL,两边SQL结构统一后,QuickPerf计数即可保持一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:25:55