Введение в программирование на C# 2.0

Имитация отсоединенности. Пул соединений


В ADO .NET официально заявлено, что в приложении используются ОТСОЕДИНЕННЫЕ компоненты.

Присоединились, каким-то образом получили требуемую информацию, отсоединились... Но есть проблема. Открытие и закрытие соединения с БД – операция трудоемкая. Поддерживать соединение постоянно – плохо. Обрывать и восстанавливать соединение всякий раз по мере необходимости – тоже получается плохо. Компромиссное решение – ПУЛ соединений: место, где сохраняются установленные и неиспользуемые в данный момент соединения.

Приложение создает объект соединения, устанавливает соединение с базой, использует его и, не разрывая соединения с базой, передает его в ПУЛ соединений. В дальнейшем, по мере необходимости, объект соединения используется из пула. Если несколько приложений стремятся одновременно получить доступ к БД и в пуле не остается свободных соединений – создается и настраивается новый объект, который после употребления приложением также передается в пул. Таким образом поддерживается несколько готовых к использованию соединений, общее количество которых (по крайней мере теоретически) оказывается меньше общего количества приложений, работающих с базой в данный момент.

Пул включается по умолчанию. И при этом выполнение оператора

rollsConnection.Close();

приводит НЕ К РАЗРЫВУ соединения с базой, а к передаче этого соединения в пул соединений для повторного использования. Запретить размещение объекта соединения в пуле можно, указав в строке соединения для OLE DB .NET атрибут

OLE DB Services = –4

при котором провайдер OLE DB .NET не будет помещать соединение в пул при закрытии, а будет всякий раз его разрывать и устанавливать заново.

Пул соединений освобождается при выполнении метода Dispose. Этот метод вызывается сборщиком мусора при завершении приложения. В теле этого метода обеспечивается вызов метода Close. Таким образом, даже незакрытое соединение при завершении приложения закрывается. Явный вызов этого метода также приводит к разрыву соединения, освобождению занимаемых ресурсов и подготовке объекта к уничтожению сборщиком мусора.

На самом деле, если класс предоставляет метод Dispose(), именно его, а не Close(), следует вызывать для освобождения занимаемых объектом ресурсов.



Содержание раздела