首页 > 解决方案 > 尝试删除条目时收到 System.IO.IOException

问题描述

我有一个包含 60 个表的数据库。一个是person被大量其他表(大约 40 个)引用的表,主要使用ON DELETE CASCADE ON UPDATE CASCADE.

使用 Npgsql,我尝试运行以下命令: DELETE FROM person WHERE id = @PersonId

结果我收到了一个 System.IO.Exception:

Npgsql.NpgsqlException (0x80004005): 从流中读取时出现异常 ---> System.IO.IOException: Von der Übertragungsverbindung können keine Daten gelesen werden: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat。---> System.Net.Sockets.SocketException: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht Richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat bei System.Net.Sockets。 Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset,

在英语中,内部异常是

Npgsql.NpgsqlException (0x80004005):从流中读取时出现异常---> System.IO.IOException:无法从传输连接中读取数据:连接尝试失败,因为远程站在一段时间后没有正确响应, 或已建立的连接错误,因为连接的主机没有响应。---> System.Net.Sockets.SocketException: 连接尝试失败,因为远程站在一定时间后没有正确响应,或者连接失败,因为连接的主机没有响应 System.Net.Sockets。System.Net.Sockets.NetworkStream.Read (Byte [] buffer, Int32 offset, Int32 size) 处的 Socket.Receive (Byte [] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) --- 内部异常堆栈跟踪结束

在 Postgres 日志中它说:

2019-03-28 12:42:15.077 CET [75060] LOG: konnte Daten vom Client nicht empfangen: unrecognized winsock error 10053

我想这不是死锁,因为日志中没有死锁消息。

我认为这与表被这么多外键引用的事实有关。但我不知道如何进一步调查。

标签: c#postgresqlforeign-keyssql-deletenpgsql

解决方案


根据例外情况,此问题与长时间运行的脚本超时有关。您没有包含代码示例,因此我无法专门提供增加此值的语法,但设置commandTimeout = 0将禁用超时并解决问题。

要在评论中解决您的问题,

有什么办法可以调查为什么需要这么长时间?

它可能只是删除大量记录。您应该在 C# 之外运行查询,以确保在将查询插入代码之前对其进行优化。

删除大量记录可能需要一段时间,您应该研究truncate或其他一些清除设计,例如转储到临时表等。


推荐阅读