使用Entity Framework与PostgreSQL执行DbCommand时随机超时问题咨询
PostgreSQL连接超时异常:解决方法与根本原因
异常日志
Microsoft.EntityFrameworkCore.Database.Command [Error] 执行DbCommand失败(耗时"32,028"ms)...
Microsoft.EntityFrameworkCore.Query [Error] 遍历查询结果时发生异常,上下文类型为...
"System.InvalidOperationException: 出现可能由瞬时故障引发的异常。 ---> Npgsql.NpgsqlException (0x80004005): 从流读取时发生异常 ---> System.TimeoutException: 读取尝试超时...
[Error] 出现可能由瞬时故障引发的异常。
环境详情
- 应用服务器:Linux系统,ASP.NET MVC架构
- 数据库:PostgreSQL,部署在同网络内另一台Linux服务器
临时处理方式
遇到无响应时重复请求可成功,但仅为临时 workaround,无法解决根源问题。
最终解决办法
修改数据库连接字符串,添加配置Polling=false后问题彻底解决。该方案与GitHub issue #3559中的解决方案一致。
根本原因
这个问题的核心是Npgsql驱动在Linux环境下的轮询机制兼容性问题:
- Linux环境下,Npgsql默认使用
epoll/poll这类轮询方式监听网络流的读取事件 - 当网络存在轻微波动、TCP连接处于半开状态,或者服务器内核的网络参数(如TCP keepalive配置)与轮询逻辑不匹配时,轮询机制无法正确识别数据可读状态,最终触发读取超时
- 设置
Polling=false后,驱动会切换为阻塞式IO模式,绕过了有问题的轮询逻辑,因此解决了超时问题
内容的提问来源于stack exchange,提问作者H.A.H.
相关产品推荐
相关产品推荐

