Получение System.IO.IOException при попытке удалить запись - PullRequest
0 голосов
/ 28 марта 2019

У меня есть база данных с 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 fehlgeschlaten zähichtünt rechenghegtün reghegtün reg reg eg regen de gürnegüg reg reg reghegtün - die, , oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat. ---> System. bei System.Net.Sockets.Socket.Receive (буфер Byte [], смещение Int32, размер Int32, SocketFlags socketFlags) bei System.Net.Sockets.NetworkStream.Read (буфер Byte [], смещение Int32, размер Int32) --- Ende der internen Ausnahmestapelüberwachung --- bei System.Net.Sockets.NetworkStream.Read (буфер Byte [], смещение Int32, размер Int32) bei Npgsql.NpgsqlReadBuffer. <> c__DisplayClass31_0. d.MoveNext () bei Npgsql.NpgsqlReadBuffer. <> c__DisplayClass31_0. d.MoveNext () --- Ende der Stapelüberwachung vom vorhergehenden Ort, de die die Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) bei Npgsql.NpgsqlConnector. <> c__DisplayClass161_0. d.MoveNext ()

На английском языке внутренним исключением является

Npgsql.NpgsqlException (0x80004005): исключение при чтении из stream ---> System.IO.IOException: данные не могут быть прочитаны из соединение передачи: попытка подключения не удалась, потому что удаленная станция не ответила правильно после определенного периода время, или Установленное соединение было неисправно, потому что подключенный хост Не ответил. ---> System.Net.Sockets.SocketException: соединение попытка не удалась, потому что удаленная станция не ответила правильно через определенное время или не удалось установить соединение, так как подключенный хост не отвечает на System.Net.Sockets. Socket.Receive (Байт [] буфер, смещение Int32, размер Int32, SocketFlags socketFlags) в System.Net.Sockets.NetworkStream.Read (Byte [] буфер, Смещение Int32, размер Int32) --- Конец внутренней трассировки стека исключений

В журналах Postgres написано:

2019-03-28 12: 42: 15.077 CET [75060] LOG: konnte Daten vom Client nicht empfangen: нераспознанная ошибка winsock 10053

Полагаю, это не тупик, поскольку в журналах нет сообщения о тупике.

Я думаю, это связано с тем, что на таблицу ссылается так много внешних ключей. Но я не знаю, как продолжить расследование.

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

За исключением, эта проблема связана с тайм-аутом долго работающего скрипта.Вы не включили пример кода, поэтому я не могу специально указать синтаксис для его увеличения, но установка commandTimeout = 0 отключит тайм-аут и решит проблему.

Чтобы ответить на ваш вопрос в комментариях,

Можно ли как-нибудь выяснить, почему это занимает так много времени?

Это можетпросто удаляю большое количество записей.Вы должны запускать свои запросы вне C #, чтобы убедиться, что запросы оптимизированы, прежде чем вставлять их в код.

Удаление больших наборов записей может занять некоторое время, вам следует изучить truncate или какой-либо другой способ очистки, такой как сброс во временные таблицы и т. Д.

1 голос
/ 28 марта 2019

Мои деньги на отсутствующие индексы на внешних ключах, ссылающихся на person.

Если у вас есть такой стол:

CREATE TABLE atable (
   id bigint PRIMARY KEY,
   parent_id bigint NOT NULL
      REFERENCING parent ON DELETE CASCADE
);

, и таблица содержит много строк, затем каждая строка, удаленная в person, приведет к последовательному сканированию таблицы на atable, чтобы найти соответствующие строки. Это, вероятно, где все ваше время проведено.

Создать индекс для всех таблиц, ссылающихся на person:

CREATE INDEX ON atable (parent_id);

Это сделает удаление намного быстрее.

Этот пост в блоге подробно объясняет проблему.

...