Pregunta

Actualmente estoy creando un portal web con ASP.NET que depende en gran medida del uso de la base de datos. Básicamente, todas las consultas GET (y casi todas: P) de cualquier usuario darán como resultado una consulta a la base de datos desde el servidor web.

Ahora, soy realmente nuevo en esto, y estoy muy preocupado por el rendimiento. Debido a mi falta de experiencia en esta área, realmente no sé qué esperar.

Mi pregunta es, utilizando ADO.NET, ¿sería una opción más inteligente dejar una conexión estática abierta desde el servidor web a la base de datos y luego verificar la integridad de esta conexión del servidor antes de cada consulta a la base de datos? - O, ¿sería mejor abrir la conexión antes de cada consulta y luego cerrarla después?

En mi opinión, la primera opción sería la mejor, ya que ahorra tiempo en el handshaking, etc., antes de cada consulta y ahorra memoria tanto en la base de datos como en el servidor, ya que solo tiene una conexión, pero hay algún inconveniente en este enfoque. ? ¿Podrían enviarse 2 consultas al mismo tiempo que podrían destruir la integridad de las demás o combinar el conjunto de datos devuelto?

He intentado buscar en todas partes aquí y en la web para encontrar algunas de las mejores prácticas sobre esto, pero sin suerte. Lo más cercano que obtuve fue esto: es seguro mantener las conexiones de la base de datos abiertas durante mucho tiempo , pero eso parece ser más adecuado para los sistemas distribuidos en los que tiene más de un usuario de la base de datos, mientras que solo tengo mi servidor web.

¿Fue útil?

Solución

Eres demasiado temprano para preocuparte por el rendimiento.

De todos modos, las conexiones están agrupadas por el marco. Debe abrirlos, usarlos y desecharlos lo antes posible.

Algo así como ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

Otros consejos

Es mejor dejar que ADO.NET maneje la agrupación de conexiones. Persistirá la conexión si cree que es necesario, pero no use un objeto de conexión estática. Eso solo huele. Sería mejor pasar el objeto de conexión a métodos que lo necesiten, y crear la conexión en un bloque utilizando .

Siempre debe cerrar su conexión después de finalizar su interacción con la base de datos. ADO.NET tiene una agrupación de conexiones que se encargará de la reutilización eficiente de la conexión. Siempre que abra las conexiones 2, 3 y posteriores, se tomarán de una agrupación casi sin gastos generales.

Espero que esto ayude.

Pensaría más en el almacenamiento en caché que en la agrupación avanzada de conexiones. ¿Cada obtención requiere un hit de la base de datos?

Si es un portal que tiene contenido común y contenido específico del usuario, al usar la memoria caché puede almacenar elementos comunes, así como con una clave mutilada (con la identificación del usuario) puede almacenar elementos específicos del usuario.

ADO.NET hace agrupación de conexiones. Cuando llama al objeto de conexión, mantendrá la conexión en el grupo haciendo que la próxima conexión sea mucho más rápida.

Tu presentimiento inicial es correcto. Lo que necesita es agrupación de conexiones de base de datos.

Definitivamente no desea abrir una conexión para cada llamada a la base de datos, ya que el rendimiento será extremadamente bajo muy rápidamente. Establecer una conexión de base de datos es muy costoso.

En su lugar, lo que deberías usar es un grupo de conexiones. El grupo administrará sus conexiones e intentará reutilizar las conexiones existentes cuando sea posible.

No conozco su plataforma, pero busque en la agrupación de conexiones: debe haber una biblioteca o utilidad disponible (ya sea en el sistema base o como un complemento, o suministrada con los controladores de la base de datos) que proporcionará los medios para agrupar varias conexiones activas a la base de datos, que están listas y listas para usarse cuando obtiene una del grupo.

Para ser honesto, esperaría que la agrupación se produzca de forma predeterminada en cualquier biblioteca de abstracción de base de datos (con una opción disponible para deshabilitarla). Parece que ADO.NET hace esto.

Realmente la primera pregunta es ¿por qué está tan preocupado por el rendimiento? ¿Cuál es su carga de trabajo esperada? ¿Lo has probado ya?

Pero en general, sí, es más inteligente tener una conexión abierta que mantengas cerca por un tiempo que volver a abrir una conexión de base de datos cada vez; dependiendo del tipo de conexión, los problemas de la red y la fase de la luna, puede tomar una buena parte de un segundo o más para hacer una conexión inicial; Si su carga de trabajo es tal que espera más de un GET cada cinco segundos, estará más feliz con una conexión permanente.

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