ORA-03113: конец файла в канале связи после длительного простоя в приложении ASP.Net - PullRequest
23 голосов
/ 17 сентября 2008

У меня есть приложение ASP.Net 2.0 с балансировкой нагрузки (не использующее состояние сеанса) на IIS5, которое работает на одном сервере Oracle 10g с использованием драйверов ODAC / ODP.Net версии 10.1.0.301. После длительного периода бездействия (несколько часов) приложение, по-видимому, случайным образом выдаст исключение Oracle:

Исключение: ORA-03113: конец файла на канале связи в Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src, процедура String) в Oracle.DataAccess.Client.OracleCommand.ExecuteReader (логический запрос, Булево заполнениеRequest, поведение CommandBehavior) в Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader ()

... Часть стека Oracle заканчивается здесь ...

Мы создаем новые соединения при каждом запросе, открываем и закрываем в try / catch / finally, чтобы обеспечить правильное закрытие соединения, и все это заключено в блок using (OracleConnection yadayada) {...} , Эта проблема, по-видимому, не связана с перезапуском приложения ASP.Net после отключения из-за неактивности.

Нам еще предстоит воспроизвести проблему самостоятельно. Мысли, молитвы, помощь?


Подробнее: Проверено с помощью ИТ, брандмауэр не настроен на разрыв соединений между этими серверами.

Ответы [ 7 ]

19 голосов
/ 18 сентября 2008

ORA-03113: конец файла в канале связи

Является ли база данных, сообщающая, что сетевого соединения больше нет. Это может быть потому, что:

  1. Проблема с сетью - неисправное соединение или проблема с брандмауэром
  2. Серверный процесс в базе данных, обслуживающей вас, неожиданно умер.

Для 1) ( firewall ) найдите tahiti.oracle.com для SQLNET.EXPIRE_TIME. Это параметр sqlnet.ora, который будет регулярно отправлять сетевой пакет с настраиваемым интервалом, т.е. установка этого параметра заставит брандмауэр полагать, что соединение работает.

Для 1) ( сеть ) поговорите с администратором сети (соединение может быть ненадежным)

Для 2) Проверьте alert.log на наличие ошибок. Если серверный процесс не удался, появится сообщение об ошибке. Также будет написан файл трассировки, чтобы поддержка могла определить проблему. Сообщение об ошибке ссылается на файл трассировки.

Вопросы поддержки могут быть подняты на metalink.oracle.com с подходящим Идентификатором обслуживания клиентов (CSI)

8 голосов
/ 09 августа 2009

Добавить Проверить соединение = true в строку подключения.

Посмотрите этот блог , чтобы узнать больше о.

ОПИСАНИЕ: После OracleConnection.Close () реальное соединение с базой данных не прерывается. Объект соединения помещается обратно в пул соединений. Использование пула соединений подразумевается ODP.NET. Если вы создаете новое соединение, вы получаете один из пула. Если это соединение «еще не открыто», метод OracleConnection.Open () на самом деле не создает новое соединение. Если реальное соединение разорвано (по какой-либо причине), вы получаете ошибку при первом выборе, обновлении, вставке или удалении.

С помощью Validate Connection реальное соединение проверяется в методе Open ().

5 голосов
/ 17 сентября 2008

Убедитесь, что нет брандмауэра, который завершает соединение через определенный промежуток времени (это было причиной аналогичной проблемы, с которой мы столкнулись)

4 голосов
/ 12 марта 2013

конец файла в канале связи:

Один из вариантов этой ошибки - сбой базы данных при записи журнала, когда он находится в стадии открытия;

Решение проверить базу данных, если она работает в ARCHIVELOG или NOARCHIVELOG

чтобы проверить использование

select log_mode from v$database;

если он включен ARCHIVELOG попытаться изменить на NOARCHIVELOG

с использованием sqlplus

  • загрузочное крепление
  • изменить базу данных noarchivelog;
  • изменить открытую базу данных;

, если это работает для этого

Затем вы можете отрегулировать свою область восстановления, возможно, она заполнена. -> затем, после подтверждения, что в вашей области флэш-восстановления есть место, где вы можете изменить базу данных на ARCHIVELOG

3 голосов
/ 25 марта 2014

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

После исправления проблемы с пространством это конкретное сообщение об ошибке исчезло.

1 голос
/ 18 сентября 2008

Вы можете попробовать взломать этот реестр:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000001
"KeepAliveTime"=dword:00120000

Если это работает, просто продолжайте увеличивать KeepAliveTime. В настоящее время он установлен на 2 минуты.

0 голосов
/ 09 октября 2008

Статья, упомянутая ранее, хороша. http://forums.oracle.com/forums/thread.jspa?threadID=191750 (насколько это возможно)

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

Есть еще одна «ошибка», которая не упоминается в статье. Если первое, что вы пытаетесь сделать с соединением, это вызвать хранимую процедуру, то ODP будет ВЕРНУТЬСЯ !!!! Вы не получите обратно ошибку, чтобы справиться, просто полнопроходной HANG! Единственный способ исправить это - отключить пул соединений. Как только мы это сделали, все проблемы исчезли.

В некоторых ситуациях пул полезен, но за счет повышенной сложности вокруг первого утверждения каждого соединения.

Если подход к обработке ошибок настолько хорош, почему они не делают опцию для ODP обрабатывать его для нас ????

...