Утечки соединения в классическом ASP с использованием Server.CreateObject («ADODB.Connection») - PullRequest
1 голос
/ 26 октября 2011

Я смотрю на существующее классическое приложение asp.Настройка выглядит следующим образом:

  • db.asp: открывает соединение с помощью Server.CreateObject ("ADODB.Connection"), а затем вызывает conn.open
  • func.asp: hasвспомогательные методы для выполнения запросов с использованием объекта conn из db.asp
  • index.asp: создает запросы и делает вызовы методов в func.asp

как index.asp, так и func.asp включает db.asp.index.asp включает func.asp Нет, где вызывается conn.close.

  1. Будут ли автоматически закрываться или восстанавливаться соединения после завершения запроса?
  2. Каковы последствия того, что index.asp и func.asp включают db.asp, когда index.asp включает func.asp?Несколько подключений?
  3. Есть ли счетчики для проверки количества выполняемых подключений?

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

Я посмотрел в счетчиках производительности, но цифры никогда не меняются.Они остаются на уровне 5. MSSQL $ Instance: Общая статистика \ Логические соединения и MSSQL $ Instance: Общая статистика \ Пользовательские подключения.

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

Запуск классического asp под IIS 7.5

1 Ответ

3 голосов
/ 26 октября 2011
  1. Нет, соединения остаются открытыми, но драйвер базы данных в конечном итоге уничтожит их. Однако это займет несколько минут, поэтому вы можете легко достичь предела базы данных для числа одновременных подключений, если у вас много посетителей.
  2. Да, если у вас есть несколько включений для кода, который открывает соединение, у вас будет несколько подключений. Если соединения хранятся в той же переменной, ссылка на предыдущее соединение будет потеряна и будет оставлена ​​открытой в ожидании тайм-аута.
  3. Вы можете посмотреть сеансы базы данных в SQL Manager. Однако вы не сможете легко увидеть разницу между соединениями, которые возвращаются в пул, и потерянными соединениями, ожидающими тайм-аут.

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

rstData.Close
Set rstData = Nothing

conn.Close
Set conn = Nothing
...