VB6 ADO Connection Pooling
connection-pooling (3)
Tenemos un montón de aplicaciones VB6 en nuestra compañía. Estamos intentando depurar un error aleatorio de tiempo de espera de SQL e hicimos un seguimiento con SQL Server Profiler en el evento de inicio de sesión de auditoría. Notamos que las conexiones entraban como no agrupadas. Usamos el proveedor SQLOLEDB con SQL Server 2000 y 2005. Busqué en Internet y todo lo que encuentro dice que las conexiones se agrupan por defecto en el proveedor SQLOLEDB, pero no estamos viendo esto. A continuación se muestra el código que usamos para conectarnos a la base de datos. Realmente necesitamos tener estas conexiones agrupadas porque creemos que este puede ser el problema con nuestro error de tiempo de espera aleatorio. ¿Alguien podría aclarar por qué la agrupación de conexiones no funciona y de alguna manera hacer que funcione? Gracias.
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
La eliminación de la conexión en cada llamada podría evitar la agrupación
... al menos una instancia de un objeto Connection instanciado para cada usuario único, en todo momento. De lo contrario, el grupo se destruirá cuando se cierre el último objeto de conexión para esa cadena.
Me equivoqué y abrí una conexión al inicio de la aplicación y la mantuve abierta durante todo el tiempo que se ejecutó la aplicación. La agrupación de conexiones se inició después de la segunda conexión abierta y cerrada.
Mencionaste que intentabas rastrear un problema de tiempo de espera aleatorio. He tenido lo mismo, generalmente cuando estaba haciendo un SELECT que me devolvió muchas filas. Dos cosas:
Cnn.CursorLocation = ADODB.adUseServer
(La otra opción es adUseClient) - Creo que adUseServer me dio consultas más rápidas, lo que redujo la probabilidad de tiempos de espera. Usted hace esto antes de abrir la conexión, creo.
Cnn.CommandTimeout = 0
También antes de abrir (), le dice que quiere un tiempo de espera infinito. Creo que el tiempo de espera predeterminado es algo así como 30 segundos, que era demasiado corto para algunas consultas. CommandTimeout se usará para consultas de conjunto de registros. Si usa un objeto Command, tiene su propio miembro CommandTimeout, que no parece heredar de la conexión (es decir, lo configuro antes de ejecutar un comando).
Lo siento si la sintaxis no es correcta, estoy recortando algunos códigos C ++.