Технология Microsoft ADO.NET

       

Работа с пулом соединений. Microsoft SQL Profiler


Подключение к базе данных требует затрат времени - в самом деле, необходимо установить соединение по каналам связи, пройти аутентификацию и лишь после этого можно выполнять запросы и получать данные. Клиентское приложение, взаимодействующее с базой данных и закрывающее каждый раз соединение при помощи метода Close, будет не слишком производительным: значительная часть времени и ресурсов будет тратиться на установку повторного соединения. А что, если использовать трехуровневую модель, при которой клиентское соединение будет взаимодействовать с базой данных через промежуточный сервер? В этой модели клиентское приложение открывает соединение через промежуточный сервер (рис. 4.13, А). После завершения работы соединение закрывается приложением, но промежуточный сервер продолжает удерживать его в течение заданного промежутка времени, например, 60 секунд. По истечении этого времени промежуточный сервер закрывает соединение с базой данных (рис. 4.13, Б). Если в течение этой минуты, например, после 35 секунд, клиентское приложение снова требует связи с базой данных, то сервер просто предоставляет уже готовое соединение, причем после завершения работы обнуляет счет времени и готов снова минуту ждать обращения (рис. 4.13, В).


увеличить изображение
Рис. 4.13.  Трехуровневая модель соединения с базой данных. А - открытие соединения, начало отсчета, Б - Закрытие соединения промежуточным сервером по истечении минуты, В - Обращение клиентского приложения и предоставление сервером соединения в течении минуты ожидания

В результате использования этой модели сокращается время, необходимое для установки связи с удаленной базой данных. Можно провести аналогию со следующей ситуацией: представьте, что вам и вашим друзьям нужно поговорить с одним и тем же человеком на другом конце земного шара. Вы можете звонить по отдельности и потратить достаточно много времени на то, чтобы дозвониться до человека, дождаться, пока его позовут к телефону, и т.п.
А можно собраться вместе с друзьями и дозвониться один раз, затем просто передавать трубку друг другу для разговора. Телефон в данном случае будет выступать в качестве пула соединений. Вернемся к нашей модели. Промежуточный сервер тоже будет выступать в качестве пула соединений. Более того, если к нему будут обращаться несколько клиентских приложений (несколько друзей), использующих одинаковую базу данных и параметры авторизации (один человек на другом конце земного шара), то выигрыш времени будет еще более заметным.

При создании подключения с использованием поставщиков данных .NET автоматически создается пул соединений. При вызове метода Close соединения не разрывается, а по умолчанию помещается в пул. В течение 60 секунд соединение остается открытым, и если оно не используется повторно, поставщик данных закрывает его. Если же по каким-либо причинам нам необходимо закрывать соединение, не помещая его в пул, в строке соединения СonnectionString нужно вставить дополнительный параметр. Для поставщика OLE DB:

OLE DB Services=-4;

Для поставщика SQL Server:

Pooling=False;

Теперь при вызове метода Close соединение действительно будет разорвано.

Поставщик данных Microsoft SQL Server предоставляет также дополнительные параметры управления пулом соединений (таблица 4.4).

Таблица 4.4. Параметры пула соединения поставщика MS SQL ServerПараметр Описание Значение по умолчанию
Connection Lifetime Время (в сек.), по истечении которого открытое соединение будет закрыто и удалено из пула. Сравнение времени создания соединения с текущим временем проводится при возвращении соединения в пул. Если соединение не запрашивается, а время, заданное параметром, истекло, соединение закрывается. Значение 0 означает, что соединение будет закрыто по истечении максимального предусмотренного тайм-аута (60 сек.) 0
Enlist Необходимость связывания соединения с контекстом текущей транзакции2) потока True
Max Pool Size Максимальное число соединений в пуле. При исчерпании свободных соединений клиентское приложение будет ждать освобождения свободного соединения 100
Min Pool Size Минимальное число соединений в пуле в любой момент времени 0
Pooling Использование пула соединений True
<


Для задания значения параметра, отличного от принятого по умолчанию, следует явно включить его в строку ConnectionString.

Для слежения за процессом подключения к серверу и организацией пула соединений воспользуемся утилитой Profiler3), входящей в пакет Microsoft SQL Server 2000. Переходим в меню "Пуск" к группе Microsoft SQL Server и запускаем утилиту. В появившемся окне программы переходим "File \ New \ Trace" (или используем сочетание клавиш Ctrl+N). Появляется подключение к серверу. Это окно нам уже знакомо по работе с программой Query Analyzer. На этот раз подключимся к серверу от имени администратора "sa" (рис. 4.14):


Рис. 4.14.  Подключение к серверу

Далее появляется окно Trace Properties (Свойства трассировки), в котором можно задать название трассировки, а также расположение файла для сохранения (галочка "Save to file") (рис. 4.15).


Рис. 4.15.  Свойства трассировки

Нажимаем кнопку "Run" для начала работы. Появляется окно, в котором будет записываться все обращения к серверу. Запускаем приложение ExceptionsSQL, вводим данные для аутентификации и нажимаем кнопку "Соединение" - SQL Profiler немедленно зафиксирует обращение (рис. 4.16).


увеличить изображение
Рис. 4.16.  Окно трассировки после подключения к серверу

Соединение по умолчанию помещается в пул, в окне трассировки мы не видим его разрыва - записи "Audit Logout". Ее можно увидеть, завершив работу с приложением ExceptionsSQL (рис. 4.17).


увеличить изображение
Рис. 4.17.  Окно трассировки после завершения работы с приложением "ExceptionsSQL"

Открываем проект ExceptionsSQL в среде Visual Studio .NET, изменим строку соединения - отключим необходимость создания пула. Строка ConnectionString теперь будет выглядеть так (добавлен параметр "Pooling"):

conn.ConnectionString = "initial catalog=" + txtInitialCatalog.Text + ";" + "user id=" + txtUserID.Text + ";" + "password=" + txtPassword.Text + ";" + "data source=" + txtDataSource.Text + ";" + "workstation id=9E0D682EA8AE448;persist security info=True;Pooling=False";



Теперь при соединении с сервером соединение будет разрываться без помещения в пул - запись "Audit Logout" будет появляться сразу же (рис. 4.18):


увеличить изображение
Рис. 4.18.  Окно трассировки после подключения к серверу без создания пула соединений

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

  1)

  Для скрывания пароля при вводе можно в свойстве "PasswordChar" текстового поля ввести заменяющий символ, например, звездочку ("*").

  2)

  Описание транзакций см. в лекции 7.

  3)

  Подробное описание работы с этой утилитой вы можете найти здесь: http://www.intuit.ru/department/database/sqlserver2000/35/sqlserver2000_35.html

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