EF Core连接PostgreSQL遇Socket错误,如何配置重试机制?
解决方案
要让EF Core的重试机制处理System.Net.Socket.SocketException 11001(找不到指定主机)异常,你需要添加**08001和08006**这两个PostgreSQL错误代码到EnableRetryOnFailure的errorCodesToAdd参数中。
原因说明
当出现DNS解析失败(错误码11001)这类连接建立阶段的错误时,Npgsql会将底层Socket异常包装为NpgsqlException,并映射到PostgreSQL标准的连接类错误代码:
08001:通用连接异常(connection_exception)08006:连接失败(connection_failure)
这两个代码默认不在EF Core重试机制的处理列表中,因此需要手动添加。
代码示例
services.AddDbContext<YourDbContext>(options => options.UseNpgsql("你的数据库连接字符串", npgsqlOpts => npgsqlOpts.EnableRetryOnFailure( maxRetryCount: 3, // 自定义重试次数 maxRetryDelay: TimeSpan.FromSeconds(5), // 自定义重试间隔 errorCodesToAdd: new[] { "08001", "08006" } ) ) );
验证方式
如果不确定具体错误代码,可在异常捕获逻辑中查看NpgsqlException的SqlState属性,获取对应的PostgreSQL错误代码:
try { // 数据库操作逻辑 } catch (NpgsqlException ex) { Console.WriteLine($"对应错误代码:{ex.SqlState}"); }
内容的提问来源于stack exchange,提问作者Simon K
相关产品推荐
相关产品推荐

