Соединения — ограниченный серверный ресурс. Это значит, что открывать соединение нужно как можно позже, и освобождать как можно быстрее. В предыдущем примере кода обработчик исключения построен так. чтобы гарантировать, что даже если возникнет непредвиденное необработанное исключение, все равно
соединение будет закрыто в блоке finally. Если не использовать такой подход, то в случае необработанного исключения соединение останется открытым до тех пор, пока сборщик мусора не уничтожит объект SqlConnection.

Альтернативный подход состоит в том, чтобы поместить ваш доступ к данным в блок using. Оператор using декларирует, что вы используете уничтожаемый объект в течение краткого периода времени. Как только блок using завершится, CLR немедленно освобождает соответствующий объект, вызывая метод Dispose(). Интересно, что вызов Dispose() для объекта Connection эквивалентен вызову Close(). Это значит, что вы можете переписать предыдущий пример в следующей, более компактной форме:

string connectionString =
  WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
using (con)
{
  con.Open();
  lblInfo.Text = "<b>Server Version:</b> " + con.ServerVersion;
  lblInfo.Text += "<br /><b>Connection Is:</b> " + con.State.ToString();
}
lblInfo.Text += "<br /><b>Now Connection Is:</b> ";
lblInfo.Text += con.State.ToString();

Лучше всего здесь то, что нет необходимости писать блок finally — оператор using освобождает используемый объект, даже при выходе из блока в результате необработанного исключения.

Организация пула соединений

Получение соединения требует короткого, но определенного времени. В Web-приложении, в котором эффективно обрабатываются запросы, соединения будут открываться и закрываться бесконечно — по мере обработки новых запросов. В этой среде небольшие накладные расходы на установку соединения становятся
весьма ощутимыми, и ограничивают масштабируемость системы.

Одним из решений проблемы может быть организация пула соединений. Пул соединений — это практика хранения постоянного набора открытых подключений к базе данных, разделяемых между сеансами, использующими один и тот же источник данных. Это позволяет избежать необходимости в постоянном создании и уничтожении соединений. Пулы соединений в ADO.NET полностью прозрачны для программиста, и ваш код доступа к данным не потребует никаких изменений. Когда клиент запрашивает соединение, вызывая Open(), этот вызов обслуживается непосредственно из доступного пула, без повторного открытия. Когда клиент освобождает соединение вызовом Close() или Dispose(), оно не закрывается, а возвращается в пул, чтобы обслужить следующий запрос.

ADO.NET не включает в себя механизм организации пула соединений. Однако большинство провайдеров данных ADO.NET реализуют некоторую форму пула соединений. Провайдеры данных SQL Server и Oracle реализуют свои собственные эффективные алгоритмы организации пулов соединений. Эти алгоритмы реализованы полностью в управляемом коде и, в противовес распространенным заблуждениям, не используют службы уровня предприятия СОМ+. Чтобы соединение было довторно использовано в SQL Server или Oracle, строки подключений должны в точности совпадать., Если они отличаются хоть немного, создается новое подкяючение в новом пуле.

предыдущая    следующая страница   оглавление

306

Hosted by uCoz