Tengo mi lógica empresarial implementada en clases estáticas simples con métodos estáticos. Cada uno de estos métodos abre / cierra la conexión SQL cuando se llama:
public static void DoSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
Pero creo que evitar abrir y cerrar una conexión ahorra rendimiento . Hice algunas pruebas hace mucho tiempo con la clase OleDbConnection (no estoy seguro sobre SqlConnection), y definitivamente ayudó a trabajar así (por lo que recuerdo):
//pass the connection object into the method
public static void DoSomething(string something, SqlConnection connection)
{
bool openConn = (connection.State == ConnectionState.Open);
if (!openConn)
{
connection.Open();
}
// ....
if (openConn)
{
connection.Close();
}
}
Entonces la pregunta es: ¿debo elegir el método (a) o el método (b)? Leí en otra pregunta de stackoverflow que la agrupación de conexiones me ahorró rendimiento, no tengo que molestarme en absoluto ...
PD. Es una aplicación ASP.NET: las conexiones solo existen durante una solicitud web. No es una aplicación o un servicio para ganar.
c#
sqlconnection
Alex
fuente
fuente
DbConnection.StateChange
evento para monitorear los cambios en el cambio de estado de la conexión (y puede almacenarse localmente) en lugar de verificar laDbConnection.State
propiedad directamente. Le ahorrará costes de rendimiento.Respuestas:
Apégate a la opción a .
La agrupación de conexiones es tu amiga.
fuente
Utilice el método (a), siempre. Cuando comience a escalar su aplicación, la lógica que trata con el estado se convertirá en un verdadero problema si no lo hace.
La agrupación de conexiones hace lo que dice en la lata. Solo piense en lo que sucede cuando la aplicación escala y lo difícil que sería administrar manualmente el estado de apertura / cierre de la conexión. El grupo de conexiones hace un buen trabajo al manejar esto automáticamente. Si le preocupa el rendimiento, piense en algún tipo de mecanismo de memoria caché para que nada se bloquee.
fuente
Siempre cierre las conexiones tan pronto como haya terminado con ellas, para que la conexión de la base de datos subyacente pueda volver al grupo y estar disponible para otras personas que llaman. La agrupación de conexiones está bastante bien optimizada, por lo que no hay una penalización notable por hacerlo. El consejo es básicamente el mismo que para las transacciones: manténgalos breves y cerrados cuando haya terminado.
Se vuelve más complicado si se encuentra con problemas de MSDTC al usar una sola transacción en torno al código que usa múltiples conexiones, en cuyo caso realmente tiene que compartir el objeto de conexión y solo cerrarlo una vez que finaliza la transacción.
Sin embargo, está haciendo las cosas a mano aquí, por lo que es posible que desee investigar las herramientas que administran las conexiones por usted, como DataSets, Linq to SQL, Entity Framework o NHibernate.
fuente
Descargo de responsabilidad: sé que esto es antiguo, pero encontré una manera fácil de demostrar este hecho, así que estoy poniendo mis dos centavos.
Si tiene problemas para creer que la agrupación realmente va a ser más rápida, pruebe esto:
Agregue lo siguiente en algún lugar:
Ahora reemplace todas las llamadas a
Open()
conTimedOpen()
y ejecute su programa. Ahora, para cada cadena de conexión distinta tenga, (salida) ventana de la consola tendrá un único larga duración abierta, y un montón de muy aperturas rápidas.Si desea etiquetarlos, puede agregarlos
new StackTrace(true).GetFrame(1) +
a la llamadaWriteLine
.fuente
Hay distinciones entre conexiones físicas y lógicas. DbConnection es un tipo de conexión lógica y utiliza una conexión física subyacente a Oracle. Cerrar / abrir DbConnection no afecta su rendimiento, pero hace que su código sea limpio y estable; en este caso, las fugas de conexión son imposibles.
También debe recordar los casos en que existen limitaciones para las conexiones paralelas en el servidor de base de datos, teniendo en cuenta que es necesario hacer sus conexiones muy cortas.
El grupo de conexiones lo libera de la verificación del estado de la conexión: solo ábralos, úselos y ciérrelos inmediatamente.
fuente
Por ejemplo, cuando el usuario ejecuta una acción de carga, su aplicación necesita buscar primero el saldo del usuario y actualizarlo, deben usar la misma conexión.
Incluso si ado.net tiene su grupo de conexiones, el costo de envío de la conexión es muy bajo, pero reutilizar la conexión es una mejor opción.
Debido a que la conexión se bloquea cuando ejecuta alguna consulta o comando, eso significa que su aplicación solo está haciendo una operación de base de datos al mismo tiempo, qué bajo rendimiento es.
Un problema más es que su aplicación siempre tendrá una conexión a pesar de que su usuario simplemente la abre pero no hay operaciones. Si hay muchos usuarios que abren su aplicación, el servidor db costará toda su fuente de conexión pronto, mientras que sus usuarios no lo han hecho. cualquier cosa.
fuente