Pregunta

Tenemos un objeto .NET que lee y escribe mucho con la base de datos. A lo largo del ciclo de vida de este objeto (o la página asp que lo usa), puede llegar a la base de datos con una consulta / actualización en cualquier lugar de 1 a 10 veces.

En lugar de abrir y cerrar una conexión de base de datos cada vez que el objeto necesita golpear la base de datos, simplemente abre una conexión a la base de datos durante la creación de instancias y luego cierra la conexión durante el evento de terminación del objeto. ¿Es una mala práctica?

Se suponía que, dado que el objeto golpea la base de datos cada vez que se instancia (y generalmente varias veces), sería mejor simplemente abrir una conexión al comienzo de la vida del objeto y luego cerrarla al final.

La otra alternativa es abrir y cerrar la conexión de la base de datos antes y después de cada consulta / operación.

¿Cuál es la mejor práctica aquí para maximizar el rendimiento?

**** actualización **** Gracias por los consejos chicos. ¿Alguien puede hablar más sobre el método de abrir / cerrar una conexión dentro de los eventos de instanciación / terminación de un objeto y las repercusiones de hacerlo?

¿Fue útil?

Solución

Abra y cierre la conexión según sea necesario. ADO.NET ha incorporado una agrupación de conexiones que funciona. No notará ningún problema de rendimiento a menos que lo haga en un bucle con miles de aperturas / cierres.

editar Consulte ¿Debo persistir una conexión sqlconnection en mi capa de acceso a datos? para obtener más información sobre las trampas de la persistencia de la conexión.

Otros consejos

Abrir y cerrar cada vez ... Abrir inmediatamente (lo más cerca posible) antes de la línea de código que realmente realiza la operación de la base de datos, y cerrar tan pronto como sea posible inmediatamente después. Cuando hace esto de esta manera, ADO.net realmente NO cierra la conexión, simplemente la libera nuevamente en el Grupo de conexiones de ADO.net, donde se sienta y espera la próxima solicitud de conexión con la misma cadena de conexión. No está incurriendo en la cabeza de volver a crear la conexión cada vez ...

El único problema es si está haciendo tantos intentos de conexión asincrónicamente que excede el número máximo de conexiones en el grupo ... y también hay soluciones a este problema, utilizando la clase System.Threading.ThreadPool. ..

Para agregar a la confianza en el argumento de agrupación de conexiones: mantener la conexión abierta durante más tiempo del necesario en realidad puede disminuir el rendimiento general, ya que la agrupación de conexiones no puede compartir esa conexión con otros componentes que necesitan una base de datos conexión.

Entonces, sí, abra y cierre la conexión según sea necesario. Sin embargo, sería aún más rápido si pudiera agrupar sus consultas en una sola llamada ejecutiva.

Incluso cuando ado.net NO cierra realmente la conexión, cuando lo hace: Conn.Close () se ejecuta " sp_reset_connection " en el servidor, incluso cuando sp_reset_connection es un procedimiento de almacenamiento ligero, genera algo de tráfico de red. Entonces, por ejemplo, no recomendaría cerrar y abrir la conexión dentro de un bucle.

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