ORA-03113: конец файла на канале связи после длительного бездействия в ASP.Net app

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

исключение: ORA-03113: конец файла на канале связи на Оракул.Доступа к данным.Клиент.OracleException.HandleErrorHelper(Типа Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, объект src, строковая процедура) в Оракул.Доступа к данным.Клиент.OracleCommand.ExecuteReader (логический запрос, Boolean fillRequest, CommandBehavior поведение) в Оракул.Доступа к данным.Клиент.OracleCommand.Система.Данные.IDbCommand.ExecuteReader ()

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

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

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


Подробнее: проверено с ним, брандмауэр не настроен на уничтожение соединений между этими серверами.

7 ответов


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

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

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

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

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

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

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


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

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

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

при проверке соединения реальное соединение проверяется методом Open ().


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


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

одна из ошибок связана с тем, что база данных не может записать журнал, когда он находится в стадии открытия;

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

для проверки использования

select log_mode from v$database;

если его на ARCHIVELOG попробуйте изменить на NOARCHIVELOG

С помощью sqlplus

  • startup mount
  • изменить базу данных noarchivelog;
  • alter database open;

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

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


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

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


вы можете попробовать этот хак реестра:

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

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


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

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

есть еще один "gotcha", который не упоминается в статье. Если первое, что вы пытаетесь сделать с соединением, это вызвать хранимую процедуру, ODP будет висеть!!!! Вы не получите назад условие ошибки для управления, просто полный скважины повесить! Единственный способ исправить это-отключить пул соединений. Как только мы это сделали, все проблемы исчезли.

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

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