Пул приложений IIS и сборка мусора .NET - PullRequest
3 голосов
/ 20 июля 2009

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

Очистка пула приложений очищает пул соединений (что позволяет создавать больше соединений)?

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

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

Ответы [ 2 ]

5 голосов
/ 20 июля 2009

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

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

1 голос
/ 20 июля 2009

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

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

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

...