Подтвердить что ты не робот

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

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

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

... Часть экземпляра Oracle заканчивается здесь...

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

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


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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

select log_mode from v$database;

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

используя sqlplus

  • старт-аут
  • изменить базу данных noarchivelog;
  • изменить базу данных открытым;

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

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