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

StackOverflow https://stackoverflow.com/questions/83068

Вопрос

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

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

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

Мы создаем новые соединения по каждому запросу, заключаем open & close в try / catch / finally, чтобы обеспечить надлежащее закрытие соединения, и все это заключено в блок using (OracleConnection yadayada) {...}.Похоже, что эта проблема не связана с перезапуском ASP.Сетевое приложение после того, как оно было отключено из-за бездействия.

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


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

Это было полезно?

Решение

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

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

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

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

Для 1) (сеть) обратитесь к администратору вашей сети (соединение может быть ненадежным).

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

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

Другие советы

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

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

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

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

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

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

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

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

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

select log_mode from v$database;

если его включить ARCHIVELOG попытайся переодеться в NOARCHIVELOG

используя sqlplus

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

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

Затем вы можете настроить свою область 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 (насколько это возможно)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top