¿Cerrar una conexión de base de datos en el método Dispose es correcto?
-
06-07-2019 - |
Pregunta
Sospeché que una conexión de base de datos utilizada en una de nuestras aplicaciones no siempre está cerrada. Fui a ver el código y encontré una clase DataProvider
que tiene el objeto SqlConnection
. La conexión se abre en el constructor de esta clase y se cierra en su método Dispose
(no juzgue eso, sé que mantener una conexión abierta es malo, simplemente no es mi código y no es el punto de la pregunta de todos modos). El método Dispose
se implementa así:
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_conn != null)
_conn.Close();
}
_disposed = true;
}
}
La pregunta es:
¿Siempre garantiza que la conexión está cerrada?
¿Es correcto este código?
Creo que debería llamarse a _conn.Dispose ()
: ¿estoy en lo cierto y podría afectar no cerrar la conexión (probablemente no)?
Solución
Dispose nunca se llama automáticamente.
La conexión no se cerrará hasta que se llame explícitamente al método Dispose de su objeto, o si su clase se usa en un bloque using ()
Una forma más segura es llamar al método de eliminación en su finalizador y asegurarse de que el finalizador se suprima cuando se llama al método de eliminación.
Este artículo presenta la forma correcta de implementar el patrón
¡Espero que ayude!
C & # 233; dric
Otros consejos
conn.Dispose ();
también cerrará la conexión, por lo que no puede hacer daño cambiarla para seguir el patrón de disposición.
Pero hay funcionalmente equivalente, por lo que debe haber un problema en otro lugar.
http://msdn.microsoft .com / es-us / library / system.data.sqlclient.sqlconnection.close.aspx
Si SqlConnection sale de alcance, no se cerrará. Por lo tanto, debes cerrar explícitamente conexión llamando a Cerrar o Disponer. Cerrar y desechar son Funcionalmente equivalente. Si el valor de agrupación de conexiones La agrupación es establecido en verdadero o sí, el subyacente la conexión se devuelve a la Piscina de conexión. Por otro lado, si La agrupación se establece en falso o no, el la conexión subyacente al servidor es cerrado.