tabla - ASP.NET/ADO.NET: ¿Cómo manejar muchas conexiones de bases de datos dentro de un objeto.NET?
mostrar datos de una tabla sql en c# (4)
Tenemos un objeto .NET que hace una gran cantidad de lectura / escritura con la base de datos. A lo largo del ciclo de vida de este objeto (o la página asp que lo usa), puede golpear 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 eso una mala práctica?
Se asumió que dado que el objeto llega a la base de datos cada vez que se crea una instancia (y generalmente varias veces), sería mejor 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. ¿Puede alguien hablar más sobre el método de abrir / cerrar una conexión dentro de los eventos de creación de instancias / terminación de un objeto y las repercusiones de hacerlo?
Abre y cierra cada vez ... Abre inmediatamente (lo más cerca posible) antes de la línea de código que realiza la operación de la base de datos, y cierra lo más pronto posible inmediatamente después. Cuando haces esto de esta manera, ADO.net NO cierra la conexión, simplemente la libera de nuevo en el grupo de conexiones de ADO.net, donde se encuentra y espera la próxima solicitud de una conexión con la misma cadena de conexión. No estás incurriendo en la ojeada de recrear la conexión cada vez ...
El único problema es si realiza de manera asincrónica tantos intentos de conexión que excede la cantidad máxima de conexiones en el grupo ... y también hay soluciones para 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 de lo necesario realmente puede disminuir el rendimiento general, ya que el grupo de conexiones no puede compartir esa conexión con otros componentes que necesitan una conexión de base de datos.
Entonces, sí, abra y cierre la conexión según sea necesario. Sin embargo, sería incluso más rápido si pudieras agrupar tus consultas en una única llamada de ejecutivo.
Incluso cuando ado.net NO cierra realmente la conexión, cuando lo hace: Conn.Close () ejecuta "sp_reset_connection" en el servidor, incluso cuando sp_reset_connection es un procedimiento de tienda ligera, genera algo de tráfico de red. Entonces, por ejemplo, no recomendaría cerrar y abrir la conexión dentro de un bucle.
Abra y cierre la conexión según sea necesario. ADO.NET ha creado una agrupación de conexiones que funciona. No notará ningún problema de rendimiento a menos que esté haciendo esto en un ciclo con miles de aperturas / cierres.
editar Ver ¿Debería persistir una sqlconnection en mi capa de acceso a datos? para obtener más información sobre las dificultades de la persistencia de la conexión.