2010-09-02 1 views
0

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

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

Говоря с администратором базы данных, я открыл тестовую веб-страницу. DBA смог увидеть, что я подключил и отметил 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. 

ответ

0

«Страница завершения загрузки, для этого, должен существовать метод Close обоих объектов ».

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

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

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

+1

Прошу прощения .. Я был неясен. Приложение-тест ВЫЗЫВАЕТ метод close для объекта соединения (и ничего не устанавливает), но соединение остается в соответствии с oracle и администратором базы данных даже после закрытия браузера (не важно, чтобы закрытие браузера было важно). Я изменю формулировку в представлении .. спасибо. – carny666

+0

Спасибо, я понял. –

0

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

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

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