Как включить пул ресурсов OLEDB в приложении Delphi 7

Что нужно сделать, чтобы включить пул в приложении Delphi 7? Моя строка подключения:

Поставщик = SQLOLEDB.1; Начальный каталог =% s; Источник данных =% s; Пароль =% s; ID пользователя =% s; Службы OLE Db = -1

Я могу сказать, что пул соединений не достигается, глядя на счетчик производительности SQLServer: GeneralStatistics UserConnections - он сильно колеблется при запуске моего приложения. С пулом соединений я ожидал, что он достигнет устойчивого состояния. Кроме того, я вижу, что оба счетчика Logins / sec и Logouts / sec очень высоки - если бы использовался пул соединений, Logouts / sec был бы равен нулю или близок к нему.

В процессе поиска я нашел эту статью о пуле ресурсов:

http://www.ddj.com/database/184416942

Он предполагает, что «Если вы работаете на уровне OLEDB SDK (или COM) с использованием ATL, вам нужно написать еще код» (помимо добавления OLE Db Services = -1 в строку подключения), чтобы получить пул подключений:

CDataSource db; CDBPropSet dbinit (DBPROPSET_DBINIT);

dbinit.AddProperty (DBPROP_AUTH_USERID, "MyName); dbinit.AddProperty (DBPROP_INIT_DATASOURCE," MyServer); dbinit.AddProperty (DBPROP_INIT_CATALOG, "MyDb); dbinit.AddProperty (DBPROP_INIT_PROMPT, (короткий) 4); dbinit.AddProperty (DBPROP_INIT_LCID, (длинный) 1033); .OpenWithServiceComponents (_T ("sqloledb"), & dbinit);

К сожалению, этот код для меня греческий, и я не уверен, как перевести его на Delphi (или, если это вообще необходимо).

Я также стараюсь вообще не менять строку подключения. Есть какие-нибудь предложения о том, что еще мне может понадобиться для включения пула ресурсов?


person James Cadd    schedule 10.04.2009    source источник


Ответы (2)


Вам необходимо постоянно держать один экземпляр соединения открытым ... если он упадет до нуля, ADO повторно установит соединение для аутентификации пользователя.

person Darian Miller    schedule 10.04.2009
comment
Но разве функция пула соединений не позволяет коду часто открывать и закрывать соединения, фактически не закрывая соединение с сервером? Если я запускаю тот же код в IIS, я вижу, что он создает 2 подключения к серверу Db, которые действуют в течение всего времени существования приложения. - person James Cadd; 12.04.2009
comment
Это больше похоже на повторное использование существующих недавних активных подключений. Скажем, счет идет к нулю ... как вы думаете, как долго пул должен поддерживать соединение (я) открытыми с базой данных? Я считаю, что с нуля он начинает очистку и в конечном итоге завершает все соединения. Я не проверял точные временные рамки. - person Darian Miller; 13.04.2009
comment
Спасибо, Дариан, это также объясняет, почему IIS держит несколько открытых соединений. Я отмечу это как ответ и отредактирую, если тестирование докажет обратное. - person James Cadd; 13.04.2009

Вы не упоминаете об этом, но используете ли вы реализацию Delphi ADO (dbGo для Delphi 7, IIRC) для доступа к данным? Если да, то подключаете ли вы все через один и тот же TADOConnection? Если это так, он должен выполнять пул для вашего приложения (это означает, что одна работающая копия вашего приложения использует одно соединение с сервером БД).

person Ken White    schedule 10.04.2009
comment
Да, я использую dbGo в Delphi 7. Одно и то же соединение не используется во всем коде, и я надеялся, что объединение может помочь. - person James Cadd; 11.04.2009