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 conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtata, Object sr procedure. .OracleCommand.ExecuteReader (логический запрос, логический запрос fillRequest, поведение CommandBehavior) в Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader ()

... На этом часть стека Oracle заканчивается ...

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

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


Еще. По сообщению ИТ-отдела, брандмауэр не настроен на отключение соединений между этими серверами.


person Greg Hurlman    schedule 17.09.2008    source источник
comment
Возможно, пул соединений проблемы stackoverflow.com/questions/15980979/ Как ваш connection string?   -  person Kiquenet    schedule 27.11.2015


Ответы (7)


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

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

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

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

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

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

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

person mathewbutler    schedule 18.09.2008
comment
Где находится alert.log и когда он создается? - person Kiquenet; 27.11.2015
comment
Журнал предупреждений - это журнал на стороне базы данных. Поговорите со своим администратором баз данных и попросите его найти отметку времени, когда вы получите сообщение об ошибке. Вы всегда должны смотреть в этот журнал на предмет ошибок ORA-3113 или подобных ошибок потери сеанса. - person Christian Shay; 03.02.2016

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

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

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

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

person Christian13467    schedule 08.08.2009
comment
Однако обратите внимание, что установка флага влечет за собой снижение производительности в соответствии с документы: This attribute should be used only when absolutely necessary, because it causes a round-trip to the database to validate each connection immediately before it is provided to the application. - person Evgeniy Berezovsky; 20.12.2013
comment
Конечно, вы абсолютно правы! Проверка соединения выполняет один дополнительный обход базы данных, чтобы убедиться, что соединение все еще установлено. - person Christian13467; 29.01.2014
comment
Проблемы пул соединений stackoverflow.com/questions/15980979/ и собраноdotnet.wordpress.com/2009/05/29/ - person Kiquenet; 27.11.2015

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

person hamishmcn    schedule 17.09.2008
comment
Похоже, у вас другая проблема, чем у нас (хотя в нашем случае ИТ-специалисты также заверили нас, что это не брандмауэр, в конце концов кто-то понял, что брандмауэр необходимо перезагрузить до того, как произошло изменение) - person hamishmcn; 17.09.2008
comment
Я столкнулся с этим при установке DoD Oracle. Сетевым администраторам нравилось настраивать правило брандмауэра, чтобы мгновенно закрыть соединение через столько минут. Тогда объединенное соединение умрет при следующей операции. - person Daniel P. Bullington; 06.05.2009

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

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

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

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

select log_mode from v$database;

если он включен ARCHIVELOG, попробуйте изменить его на NOARCHIVELOG

с помощью sqlplus

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

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

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

person Mathias Stanley    schedule 12.03.2013

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

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

person Rajesh    schedule 24.03.2014

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

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

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

person Ken Wren    schedule 18.09.2008

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

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

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

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

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

person Brad Bruce    schedule 09.10.2008