Pregunta

Por ejemplo, necesito llenar muchos DataTables con el método Fill () de SQLDataAdapter:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

Incluso todos los objetos del adaptador de datos usan la misma conexión SQLC, cada método de relleno abrirá y cerrará la conexión a menos que el estado de la conexión ya esté abierto antes de la llamada al método.

Lo que quiero saber es cómo la apertura y el cierre innecesarios de SQLConnections afectan el rendimiento de la aplicación. ¿Cuánto necesita escalar para ver los efectos negativos de este problema (100,000s de usuarios concurrentes?). En un sitio web de tamaño medio (50000 usuarios diarios) ¿merece la pena molestarse y buscar todas las llamadas de Fill (), mantenerlas juntas en el código y abrir la conexión antes de cualquier llamada de Fill () y cerrarse después?

¿Fue útil?

Solución

ADO.NET tiene agrupación de conexiones, por ejemplo, cuando cierra una conexión, no está realmente completamente cerrada, sino que " reciclada " si solicita una nueva conexión con exactamente la misma cadena de conexión.

Sin embargo, si ya sabe con anticipación que tendrá que llamar a estos cinco métodos de relleno uno por uno, definitivamente lo recomendaría

  • abriendo la conexión
  • leyendo las cinco tablas de datos de la base de datos
  • cerrar de nuevo la conexión de inmediato

Se acepta la mejor práctica para hacerlo de esta manera, no te hace daño, ¡así que hazlo! :-)

Marc

PD: la agrupación de conexiones en ADO.NET, por supuesto, solo funciona si no lo has apagado. :-) Está activado de forma predeterminada. Tendría que desactivarlo explícitamente.

Otros consejos

Punto clave:

  • ¿Por qué abrir, mantener y reutilizar las conexiones?

    Rendimiento

Hay muchas razones por las que puede querer abrir y cerrar conexiones. Usted tiene que decidir dónde está la mejor compensación para su uso de su . Puede hacer ambas cosas: usar una conexión abierta por un período de tiempo y / o un número establecido de transacciones, luego cerrarla y abrir una nueva.

Abrir y cerrar conexiones SQL es caro en comparación con otras tareas simples en la base de datos. Pero, si la tarea real su ya lleva mucho tiempo, es posible que no se note la sobrecarga adicional (si ya está ocultando el período de espera de la tarea real, por lo que el usuario no comienza a hacer clic al azar en las cosas, como reintentar).

Caso de prueba:

Puede medir la diferencia de su escribiendo dos versiones de una consulta de prueba. Selecciona cualquier tarea SQL simple (debe ser la misma en cada versión).

En la versión uno , hazlo con una única conexión abierta constante fuera del bucle, repitiendo el número de veces de tu tarea simple.

En el segundo , hazlo con la apertura y el cierre de la conexión dentro del bucle.

Cambie el número X de veces para que coincida con el uso y las expectativas de su . Eso debería darle una buena idea del impacto en su sistema.

Espero que te ayude a entender los conceptos básicos ... Jack.

RESPUESTA NECRO: La mejor manera es colocar la conexión en una declaración de 'uso' para que esté dentro del alcance del trabajo que necesita hacer:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top