3

Рассмотрите приложение ASP.NET с проблемой утечки памяти пула соединений (например, если соединения закрыты неправильно).Пул приложений IIS и сборка мусора .NET

Утилизирует ли пул приложений пул подключений пула (таким образом, можно сделать больше соединений)?

Если соединения оставлены в памяти до тех пор, пока сборщик мусора не удалит их, это произойдет, когда пул приложений перезагрузится (или они могут оставить их дальше)? Я также понимаю, что сборщик мусора может их очистить в любое время, но все еще они используются и не могут быть собраны до перезапуска или пула приложений?

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

ответ

5

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

Если процесс никогда не перезапускается и просто не теряет ручки, сборщик мусора в конечном итоге очистит их. Тем не менее, вполне вероятно, что у вас не хватит ручек для любого ресурса, протекающего до этого. Вот почему очень важно вызвать Dispose() на этих объектах (желательно с помощью шаблона «использование»), чтобы ресурсы были освобождены, как только приложение будет выполнено с ними, а не когда сборщик мусора приблизится к нему.

1

Пул соединений - это кэш соединений с базой данных. Пул приложений - это один (или более) рабочий процесс. Таким образом, когда вы закрываете пул приложений, вы закрываете свои рабочие процессы и запускаете новые рабочие процессы; это приведет к уничтожению пула и закрытию всех подключений в пуле соединений.

Если вы не вызываете Close или Dispose при подключении и полагаетесь на сборщик мусора, соединение может быть возвращено или не возвращено в пул. Я думаю, что он будет добавлен только в пул, если соединение все еще действует и максимальный размер пула достигнут. Как вы, наверное, знаете, вы никогда не должны полагаться на сборщика мусора для этого. Простым способом обеспечить соединение является Disposed - использовать оператор using, который автоматически вызовет Dispose в конце блока кода.

В ADO.NET 2.0 существуют новые методы программного управления пулами: ClearAllPools и ClearPool. Это может помочь вам решить вашу проблему, пока вы не сможете исправить весь код доступа к данным.

+0

повезло для меня, я не буду тем, кто должен сделать фиксацию! реальная проблема заключается в чрезмерном использовании datareaders в приложении ... нет блоков try/catch/finally, поэтому, если возникает ошибка, когда код dispose никогда не запускается, и соединения израсходуются ... – davidsleeps

+0

Вот как это звучало ... смешно/грустно, как одни и те же ошибки появляются снова и снова. –