Oracle соединения исчерпаны IIS - PullRequest
0 голосов
/ 02 сентября 2010

Наш администратор 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.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2010

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

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

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

0 голосов
/ 02 сентября 2010

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

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

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

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

...