连接字符串中添加statement_timeout不生效问题排查
R2DBC PostgreSQL statement_timeout 配置不生效的解决办法
正确的连接字符串写法
R2DBC PostgreSQL 驱动的options参数需要严格遵循格式才能把配置传递给PostgreSQL服务端:
- 必须用
-c前缀声明运行时参数 statement_timeout的单位默认是毫秒,也可以用s指定秒(比如1s代表1秒)- 空格要转成URL编码的
%20
有效示例:
r2dbc:postgresql://localhost:5432/schema?options=-c%20statement_timeout=1000
或者用秒单位:
r2dbc:postgresql://localhost:5432/schema?options=-c%20statement_timeout=1s
连接字符串配置失效时的替代方案
如果上面的写法还是没效果,直接在会话初始化时执行SET语句更可靠:
SET statement_timeout = 1000; -- 设置1秒超时,单位毫秒
在R2DBC代码里,拿到连接后立刻执行这条语句:
connection.createStatement("SET statement_timeout = 1000").execute().subscribe();
排查注意事项
- 驱动版本:确保用的是
io.r2dbc:r2dbc-postgresql0.9.0及以上版本,旧版本可能不支持通过options传递这类参数 - 验证配置:执行
SHOW statement_timeout;可以查看当前会话的超时设置是否生效 - 测试逻辑:
pg_sleep(9999)会运行9999秒,配置正确的话应该在指定时间后触发超时异常
内容的提问来源于stack exchange,提问作者Evgenii Golgovskikh
相关产品推荐
相关产品推荐

