Соединения Oracle исчерпаны IIS

Наш администратор базы данных Oracle (9i) позвонил мне, чтобы сообщить, что мой веб-сервер IIS (v6) исчерпал доступные соединения.

Я создал тестовую страницу (классический ASP), которая в основном создает объекты ADODB.Connection и ADODB.Recordset, подключается к базе данных, открывает базовый набор записей, перебирает его, закрывает набор записей и соединение и ничего не устанавливает для объектов. Это то, что делает большинство приложений на веб-сервере.

Во время разговора с администратором базы данных я открыл тестовую веб-страницу. Администратор базы данных смог увидеть, что я подключился, и отметил ID (я предполагаю, что этот ID помогает ему отслеживать подключение). Страница завершила загрузку, поэтому метод Close обоих объектов произошел.

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

В конце концов соединение исчезло, я полагаю, потому что пул приложений перезапустился.

Итак, мой вопрос: это нормально? Должно ли соединение не исчезать после вызова метода Close... или, по крайней мере, сеанс закрывается?

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

Event Type: Information
Event Source:   Application Error
Event Category: (100)
Event ID:   1004
Date:       7/21/2010
Time:       7:34:20 AM
User:       N/A
Computer:   VMADE02
Description:
Reporting queued error: faulting application w3wp.exe, version 6.0.3790.3959, faulting module orantcp9.dll, version 9.2.0.6, fault address 0x00005741.

person carny666    schedule 02.09.2010    source источник


Ответы (2)


"Страница завершила загрузку, поэтому должен был произойти метод Close обоих объектов."

Это «надо» на самом деле не так. Сборщик мусора запускается (и выполняет деструкторы ваших COM-объектов), когда приложению не хватает памяти или когда ему нужно убить время. Ни одно из этих условий не гарантируется каждый раз, когда IIS завершает обслуживание страницы. Рэймонд Чен недавно написал хорошую статью о что такое сборка мусора на самом деле означает, в отличие от того, что люди думают, что это означает. Он говорит о .NET, но здесь применяются те же принципы. Сборка мусора пытается имитировать бесконечный запас памяти. Он недостаточно знает об Oracle, чтобы пытаться имитировать бесконечное количество соединений с Oracle.

Вам просто нужно явно вызвать Close().

В .NET вы можете использовать блок «using», который имитирует семантику RIIA объекта стека в стиле C++. Но это не поможет в классическом ASP.

person 15ee8f99-57ff-4f92-890c-b56153    schedule 02.09.2010
comment
Извините.. Я был неясен. Тестовое приложение ДЕЙСТВИТЕЛЬНО вызывает метод close для объекта подключения (и ничего не устанавливает для него), однако соединение остается в соответствии с оракулом и администратором базы данных даже после закрытия браузера (не то, чтобы закрытие браузера имело значение). Я изменю формулировку в представлении .. спасибо. - person carny666; 02.09.2010

Я не уверен, что эта статья на самом деле настолько полезна, поскольку COM использует механизм подсчета ссылок, а не модель сборщика мусора CLR. Вот почему он установил для объектов значение Nothing, чтобы явно освободить объект.

Закрытие соединения при пуле соединений фактически не закрывает соединение. Он просто выпускает его обратно в пул. Я слышал истории о том, что пул соединений «пошел не так», поэтому, возможно, попробуйте его отключить. Вы также можете указать значение времени ожидания соединения.

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

person djones    schedule 02.09.2010