VB6 ADO Connection Pooling

В нашей компании есть несколько приложений VB6. Мы пытаемся отладить случайную ошибку тайм-аута SQL и выполнили трассировку с помощью SQL Server Profiler на событии аудита входа в систему. Мы заметили, что соединения не объединены. Мы используем поставщика SQLOLEDB с SQL Server 2000 и 2005. Я поискал в Интернете, и все, что я обнаружил, говорит, что соединения по умолчанию объединяются в пул в поставщике SQLOLEDB, но мы этого не видим. Ниже приведен код, который мы используем для подключения к базе данных. Нам действительно нужно объединить эти соединения, потому что мы думаем, что это может быть проблема с нашей случайной ошибкой тайм-аута. Может ли кто-нибудь пролить свет на то, почему пул соединений не работает и как заставить его работать? Спасибо.

Dim cnn As New ADODB.Connection
cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=xxx;Catalog=xxx;User ID=xxx Password=xxx;"
Call cnn.Open
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * FROM [Table]"
Dim rs As New ADODB.RecordSet
Call rs.Open(cmd, , adOpenStatic, adLockOptimistic)
While Not rs.eof
    'Do stuff
    Call rs.MoveNext
Wend
'Close and Dispose connection here

person awilinsk    schedule 09.01.2009    source источник


Ответы (3)


Удаление соединения при каждом вызове может предотвратить объединение в пул

... как минимум один экземпляр объекта Connection, созданный для каждого уникального пользователя - всегда. В противном случае пул будет уничтожен при закрытии последнего объекта Connection для этой строки.

http://msdn.microsoft.com/en-us/library/ms810829.aspx

person cmsjr    schedule 09.01.2009

Я напортачил и открыл соединение при запуске приложения и держал его открытым все время, пока приложение работало. Пул соединений начался после второго открытого и закрытого соединения.

person awilinsk    schedule 09.01.2009

Вы упомянули, что пытались отследить случайную проблему с тайм-аутом. У меня было то же самое, обычно когда я делал SELECT, который возвращал много строк. Две вещи:

Cnn.CursorLocation=ADODB.adUseServer

(Другой вариант - adUseClient). Я считаю, что adUseServer давал мне более быстрые запросы, что уменьшало вероятность тайм-аутов. Я полагаю, вы делаете это до того, как откроете соединение.

Cnn.CommandTimeout=0

Также перед open() сообщает, что вам нужен бесконечный тайм-аут. Я думаю, что тайм-аут по умолчанию составляет примерно 30 секунд, что было слишком мало для некоторых запросов. CommandTimeout будет использоваться для Recordset запросов. Если вы используете объект Command, у него есть собственный член CommandTimeout, который не наследуется от соединения (т. Е. Я устанавливаю его перед выполнением команды).

Извините, если синтаксис не совсем правильный, я вырезал часть кода C ++.

person Marc Bernier    schedule 09.01.2009