2011-07-20 4 views
7

Desde mi entender, .Net pondrán en común SqlConnection objetos en los que la cadena de conexión es la misma de forma predeterminada. ¿La conexión aún se combinará si llamo al método Dispose?¿El método de eliminación de SqlConnection interferirá con el grupo de conexiones?

Esta pregunta se realiza en el contexto de una aplicación ASP.NET que a veces realiza muchas visitas a la base de datos en un único evento PageLoad. Quiero que las conexiones se agrupen, pero me gustaría que confirme que el cierre y la eliminación de la conexión una vez que se complete la operación de datos no interfiere con el manejo de .NET del grupo de conexiones.

Respuesta

10

Cuando se utiliza la agrupación de conexiones, el cierre de una SqlConnection simplemente le dice al grupo de conexiones que haya terminado con él. El grupo decidirá si cierra o no la conexión, o si la vuelve a usar.

Desde el MSDN docs:

Si el SqlConnection se sale del ámbito, no se cerrará. Por lo tanto, debe cerrar explícitamente la conexión llamando a Close o Dispose. Close y Dispose son funcionalmente equivalentes. Si el conjunto de valores de agrupación de conexiones se establece en verdadero o sí, la conexión subyacente se devuelve al grupo de conexiones. Por otro lado, si Pooling está configurado en falso o no, la conexión subyacente al servidor está cerrada.

3

La documentación de MSDN en SQL Server Connection Pooling dice

conexiones son liberados de nuevo en la piscina cuando se cierran o dispuestos

y

Se recomienda encarecidamente que usted siempre cierre la conexión cuando son f se utiliza para que la conexión se devuelva al grupo . Puede hacerlo utilizando el primer o disponer métodos del objeto conexión ...

Además, es el pooler conexión que va a determinar si las conexiones se eliminan de la piscina

El pooler conexión elimina una conexión de la agrupación después de que haya estado inactivo durante mucho tiempo, o si el pooler detecta que la conexión con el servidor ha sido cortada

1

Desde mi entender, .Net pondrán en común SqlConnection objetos

No, el proveedor de SQL pondrán en común las conexiones subyacentes a SQL Server (con piscinas separadas sobre la base de la cadena de conexión).

Los SqlConnection objetos obtendrán una conexión agrupada (o crear uno nuevo, etc, en base a lo que está configurada para la puesta en común, ya sea una conexión agrupada está disponible) cuando Open se llama, y ​​dará a conocer la conexión cuando Close o Dispose es llamado.

Los dos conceptos (SqlConnection objetos y conexiones reales a SQL Server) son distintas, pero es evidente que de alguna manera relacionado.

+0

con respecto a su primer punto esto es lo que yo pensaba también, pero el doc MSDN señalé en mi respuesta parece ambigua "Cuando se crea una piscina, conexión múltiple * objetos * se crean y se añaden a la piscina para que el tamaño mínimo de la agrupación se cumple el requisito "y" Cuando se solicita un objeto SqlConnection, se obtiene del grupo si hay disponible una conexión utilizable "?? Creo que esto es engañoso, ya que contradice algunos puntos a principios de los documentos .. –

+0

@cpedros - Sí, yo diría que es engañosa - es confundir "objetos de conexión" (las conexiones subyacentes nebulosos) y "objetos SqlConnection" - 'SqlConnection' s son objetos administrados, y puede crear 10000 de ellos, todos compartiendo una sola cadena de conexión con Max Pool = 100. Fallará cuando intente * abrir * todos ellos simultáneamente. –

Cuestiones relacionadas