2009-06-19 16 views
5

Tengo la sospecha de 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 de todos modos no es el objetivo de la pregunta). El método se implementa Dispose así:¿Cerrar una conexión de base de datos en el método Dispose es correcto?

protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      if (_conn != null) 
       _conn.Close(); 
     } 

     _disposed = true; 
    } 
} 

La pregunta es:
¿Siempre se garantiza que la conexión se cierra?
¿Este código es correcto?

Creo que debería haber _conn.Dispose() llamado - estoy en lo correcto y podría afectar no cerrar la conexión (probablemente no)?

+0

Si tiene una sospecha confirmar marcando con el contador de rendimiento. – RichardOD

+0

Un valor clave para verificar es NumberOfPooledConnections. – RichardOD

Respuesta

8

Eliminar nunca se llama automáticamente.

La conexión no se cerrará hasta que el método Dispose de su objeto se llama explícitamente, o si su clase en utilizar en un usando() bloquear

Una forma más segura es llamar al método dispose en su finalizador y asegúrese de que el finalizador se suprima cuando se llama al método Dispose.

This article presente la forma correcta de aplicar el patrón

espero que ayude!

Cédric

+0

está bien, pero si la aplicación está cerrada (normalmente o por error) se llamará al método de eliminación y se cerrará la conexión. – agnieszka

+0

Cuando se cierra la aplicación, el recopilador de basura debe llamar a todos los finalizadores, de modo que al menos las conexiones se cerrarán cuando se dispare el finalizador de los objetos de Conexión ... pero esa es una forma poco convincente de cerrar una conexión;) –

+1

Y por cierto: el método de eliminación nunca se llama automáticamente.En su estado actual de código, las conexiones están cerradas porque el método de eliminación de Connection se llama en sus finalizadores –

2

conn.Dispose(); también cerrará la conexión, por lo que no se puede dañar cambiando para seguir el patrón de eliminación.

Pero hay un equivalente funcional por lo que debe haber un problema donde.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

Si el SqlConnection sale de alcance, no se cerrará. Por lo tanto, debe cerrar explícitamente la conexión llamando a Close o Dispose. Close y Dispose son funcionalmente equivalentes. Si la agrupación de valores de agrupación de conexiones es establecida en verdadero o sí, la conexión subyacente se devuelve al conjunto de conexiones . Por otro lado, si Pooling está configurado como falso o no, la conexión subyacente al servidor está cerrada.

Cuestiones relacionadas