Pregunta

En un servicio VB.Net de Windows, actualmente estoy agrupando unidades de trabajo con:

ThreadPool.QueueUserWorkItem(operation, nextQueueID)  

En cada unidad de trabajo (o hilo que usaré para facilitar la comprensión), hará un par de operaciones MSSQL de la siguiente manera:

    Using sqlcmd As New SqlCommand("", New SqlConnection(ConnString))
        With sqlcmd
            .CommandType = CommandType.Text
            .CommandText = "UPDATE [some table]"

            .Parameters.Add("@ID", SqlDbType.Int).Value = msgID

            .Connection.Open()
            .ExecuteNonQuery()
            .Connection.Close()   'Found connections not closed quick enough'
        End With
    End Using

Cuando ejecuto un netstat -a -o en el servidor, veo unas 50 conexiones al servidor SQL en IDLE o ESTABLISHED , esto me parece excesivo, especialmente porque tenemos aplicaciones web mucho más grandes que funcionan con 5-10 conexiones.

La cadena de conexión es global para la aplicación (no cambia) y también tiene Pooling = true definido.

¿Ahora cada uno de estos hilos tendrá su propio ConnectionPool , o hay un ConnectionPool para todo el proceso .EXE?

¿Fue útil?

Solución

De los documentos de MS -

" Las conexiones se agrupan por proceso, por dominio de aplicación, por cadena de conexión y cuando se utiliza seguridad integrada, por identidad de Windows "

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

¿Está experimentando errores como -

Detalles de la excepción: System.InvalidOperationException: Tiempo de espera expirado. El tiempo de espera período transcurrido antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo de grupo.

¿También cuántos elementos de trabajo se ponen en cola en el servicio?

Otros consejos

Un gran problema con su código es que no está cerrando su conexión si ExecuteNonQuery arroja una excepción. Desechar el SqlCommand no es suficiente, también debe deshacerse del SqlConnection cuando se produce una excepción, algo así como:

Using SqlConnection connection = New SqlConnection(ConnString)
    Using sqlcmd As New SqlCommand("", connection)        
        With sqlcmd            
          ... etc
        End With    
    End Using
End Using

Aunque generalmente me gusta la declaración de uso, encuentro que a veces en las bibliotecas .NET el CIERRE real de un identificador no se realiza hasta la recolección de basura. Entonces, al ser de la vieja escuela y religioso sobre tales cosas, agrego un cierre explícito al final de mi declaración de uso. Este es el código pseduo ya que generalmente codifico en C # en lugar de VB.NET, pero debería darle la idea.

Using SqlConnection connection = New SqlConnection(ConnString)

   TRY
      Using sqlcmd As New SqlCommand("", connection)
                  With sqlcmd
                        ... etc
          End With
      End Using
   FINALLY
      connection.Close()

End Using

Si el número de conexiones abiertas lo ofende, tome el control en cadena de conexión

Aviso: MinPoolSize y MaxPoolSize.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top