Cuándo debo abrir y cerrar una conexión a SQL Server


Tengo una clase estática simple con algunos métodos en ella. Cada uno de esos métodos abre una SqlConnection, consulta la base de datos y cierra la conexión. De esta manera, estoy seguro de que siempre cierro la conexión a la base de datos, pero por otro lado, no me gusta abrir y cerrar siempre la conexión. A continuación se muestra un ejemplo de cómo se ven mis métodos.

public static void AddSomething(string something)
{
    using (SqlConnection connection = new SqlConnection("..."))
    {
        connection.Open();
        // ...
        connection.Close();
    }
}

Teniendo en cuenta que los métodos están dentro de una clase estática, ¿debo tener un miembro estático que contenga una sola SqlConnection? Cómo y ¿cuándo se me cae? ¿Cuáles son las mejores prácticas?

Author: Martin, 2009-05-14

6 answers

No, no mantengas una estática SqlConnection a menos que tengas que hacerlo. Enhebrar sería una preocupación, pero lo más importante - por lo general, simplemente no es necesario. Con su código tal como se presenta, la agrupación de conexiones internas significa que la mayoría de las veces obtendrá la misma conexión subyacente en llamadas sucesivas de todos modos (siempre y cuando use la misma cadena de conexión). Deja que el pooler haga su trabajo; deja el código en paz.

Esto también evita los problemas de lo que sucede cuando comienza a tener dos hilos... ahora cada uno puede trabajar en su propia conexión; con static (suponiendo que no uses [ThreadStatic]) tendrías que sincronizar, introduciendo retrasos. Sin mencionar la reentrancia (es decir, un solo hilo tratando de usar la misma conexión dos veces al mismo tiempo). Sí; deja el código en paz. Ahora está bien, y casi cualquier cambio que hagas no estaría bien.

 45
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 04:31:00

Debido a que SqlConnection tiene un grupo de conexiones cuando llama a Open() y Close (), en realidad no está abriendo y cerrando la conexión física al servidor. Solo está agregando / eliminando la conexión de un grupo de conexiones disponibles. Por esta razón, es una buena y mejor práctica abrir la conexión lo más tarde posible y cerrar la conexión lo antes posible después de ejecutar su comando.

 18
Author: Jonathan Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 04:31:06

En su ejemplo de código no hay necesidad de llamar al método close() en el objeto de conexión, ya que se manejará automáticamente debido al código que reside dentro de un bloque using.

 5
Author: Christian Hagelid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 04:36:07

La mayoría de los programadores creen en abrir tarde y cerrar temprano. Esto solo es un problema si la latencia para abrir y cerrar la conexión cada vez hace que toda la aplicación se ralentice.

En su caso con una clase estática, probablemente sea mejor abrir y cerrar la conexión cada vez.

 3
Author: Jeremy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 04:30:07

Usted está haciendo las mejores prácticas. Solo ábrelo justo antes de que vayas a consultarlo, y ciérralo tan pronto como puedas. Este tipo de cosas puede parecer un desperdicio al principio, pero en realidad hace que su aplicación sea más escalable a largo plazo.

 1
Author: Al W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 04:30:32

Nunca confíes en que la conexión se cierre sola. Si no se cierra explícitamente, provocará problemas de rendimiento. Nos pasó en nuestro proyecto. Sí, soy consciente de que las conexiones son administradas por un grupo de conexiones, pero todavía tienen que ser cerradas y devueltas al grupo.

 -1
Author: Antwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-30 02:21:05