Пул соединений VB6 ADO - PullRequest
       25

Пул соединений VB6 ADO

4 голосов
/ 09 января 2009

У нас есть куча приложений VB6 в нашей компании. Мы пытаемся отладить случайную ошибку времени ожидания SQL и провели трассировку с помощью SQL Server Profiler в событии Audit Login. Мы заметили, что соединения входили как не пул. Мы используем провайдера 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

Ответы [ 3 ]

5 голосов
/ 09 января 2009

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

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

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

0 голосов
/ 09 января 2009

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

Cnn.CursorLocation = ADODB.adUseServer

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

Cnn.CommandTimeout = 0

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

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

0 голосов
/ 09 января 2009

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

...