使用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
相关产品推荐
相关产品推荐

