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

jOOQ 3.15.1中ResultQuery#fetchAsync()是否支持r2dbc?

问题排查与解决步骤

  1. 先打印异常定位问题
    你当前的代码直接忽略了whenComplete的异常参数,所有执行错误(包括连接失败、SQL错误、版本不兼容报错等)都会被吞掉,自然只能拿到null结果,先修改代码打印异常:
// appended to a jOOQ select query
.fetchAsync()
.thenApply{ it.map(mapping(::Film)) }
// 去掉异常参数的下划线占位,打印完整异常信息
.whenComplete { result, throwable -> 
    println("查询结果: $result")
    throwable?.printStackTrace()
}

通常到这一步你就能直接看到具体报错原因,90%以上的情况是连接配置错误或者版本不兼容导致的异常。

  1. 版本兼容性校验
    你使用的io.r2dbc:r2dbc-mssql:0.8.6.RELEASE属于R2DBC 0.8 SPI版本,仅适配jOOQ 3.15.x ~ 3.16.x版本,如果你使用的jOOQ版本≥3.17,默认适配R2DBC 1.0 SPI,和0.8版本不兼容,会出现无报错无返回的问题,要么升级r2dbc-mssql驱动到1.0+版本,要么降级jOOQ到匹配版本。

  2. 确保异步执行完成
    R2DBC是全非阻塞设计,fetchAsync()返回的CompletableFuture不会阻塞当前线程,如果你的调用逻辑是在测试用例或者短生命周期线程中执行,主线程会在异步查询完成前直接退出,导致拿不到结果,你可以在末尾加join()主动等待执行完成:

.fetchAsync()
.thenApply{ it.map(mapping(::Film)) }
.whenComplete { result, _ -> println( result ) }
.join() // 阻塞等待异步查询完成
  1. 校验R2DBC连接配置
    SQL Server的R2DBC驱动默认要求SSL连接,本地测试的SQL Server实例通常没有开SSL,需要在连接URL后加ssl=false参数,正确的URL格式如下:
    r2dbc:mssql://<你的数据库地址>:<端口>/<库名>?ssl=false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:09:02