2008-09-17 5 views
21

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

Исключение: ORA-03113: конец-из-файла на канале связи на Oracle.DataAccess. Client.OracleException.HandleErrorHelper (Int32 ERRCODE, OracleConnection сопп, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, SRC объекта, процедура Строка) при Oracle.DataAccess.Client.OracleCommand.ExecuteReader (Boolean Requery, Логическое fillRequest, поведение CommandBehavior) в Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader()

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

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

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


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

+0

Возможно ** соединение пула ** проблемы *** http: //stackoverflow.com/questions/15980979/odp-net-connection-pooling-parameters*** Как ваша строка соединения? – Kiquenet

ответ

15

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

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

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

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

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

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

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

+0

Где *** alert.log *** и когда он сгенерирован? – Kiquenet

+0

Журнал оповещений - это журнал базы данных. Поговорите со своим администратором баз данных и попросите их найти отметку времени, когда вы получите сообщение об ошибке. Вы всегда должны смотреть на этот журнал на любой ORA-3113 или аналогичную потерю ошибки сеанса. –

5

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

+0

Похоже, у вас другая проблема с тем, что у нас было (хотя в нашем случае IT также заверил нас, что это не брандмауэр, в конце концов кто-то понял, что брандмауэр должен быть перезагружен до того, как произошли изменения) – hamishmcn

+0

Я столкнулся с этим в установка DoD Oracle. Чистые администраторы любили настраивать правило брандмауэра, чтобы отключить соединение через столько минут. Тогда объединенное соединение будет умирать при следующей операции. –

1

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

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

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

0

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

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

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

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

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

7

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

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

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

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

+2

Обратите внимание, однако, что установка флага несет штраф за ** ** в соответствии с [docs] (http://docs.oracle.com/html/E10927_01/featConnecting.htm): 'Этот атрибут должен использоваться только тогда, когда абсолютно необходимо, потому что он вызывает обратную связь с базой данных для проверки каждого соединения непосредственно перед его подачей в приложение. ' –

+0

Для shure, ваше абсолютное право! Подтверждение подключения выполняет одну дополнительную транзакцию базы данных, чтобы убедиться, что соединение все еще подключено. – Christian13467

+0

Проблемы *** объединение пулов *** http://stackoverflow.com/questions/15980979/odp-net-connection-pooling-parameters и https://collecteddotnet.wordpress.com/2009/05/29/understanding- соединение-пулы / – Kiquenet

3

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

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

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

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

select log_mode from v$database; 

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

с помощью SQLPlus

  • автозапуск
  • изменить базу данных noarchivelog;
  • alter database open;

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

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

2

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

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