2009-04-02 7 views
14

¿La instrucción using realmente llama al método close cuando se usa con un objeto de conexión de base de datos? The MSDN documentation dice que asegura que se llama al método Dispose pero no menciona el cierre. Veo publicaciones en Stack Overflow donde la gente dice que hace ambas cosas. ¿Alguien tiene una respuesta concreta de Microsoft u otra prueba sólida de esto?Uso de instrucción y métodos de cierre

Respuesta

19

Aquí es el método de "Desechar" de la clase SqlConnection:

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this._userConnectionOptions = null; 
     this._poolGroup = null; 
     this.Close(); 
    } 
    this.DisposeMe(disposing); 
    base.Dispose(disposing); 
} 

Como se puede ver, en efecto, la llamada Close()

+0

esto es para objeto SqlConnection, ¿qué pasa con otros objetos de conexión? Me refiero a SqlLiteConnection o algo así? ¿Cómo podemos estar seguros de que dentro del método Dispose lo llaman Close()? Sé que la mayoría de los casos son idénticos a los anteriores, pero creo que el 1% aún permanece. –

2

Llamando al método Close llamará Dispose. No importa cuál se llame.

Un ejemplo concreto es el método FileStream.Close():

Esta implementación de Cerca llama al método Dispose pasando un valor verdadero.

1

Cualquier clase puede tener un método Dispose si implementa la interfaz IDisposable.

MSDN dice: "El uso principal de esta interfaz es liberar recursos no administrados".

Se deja al implementador decidir exactamente qué significa eso.

En el caso de un DBConnection, disponiendo también significa el cierre de la conexión ...

+0

Así que se supone que quien implementa IDisposable va a llamar a cerrar internamente en el método Dispose, ¿verdad? Esto parece un poco subjetivo ... – James

0

Cerrar y botar hacen lo mismo. Añadieron Close simplemente para legibilidad ya que decir que "Cerró la conexión" es más natural.

6

Si se utiliza una instrucción using la conexión se cierra, no tiene sentido que un objeto que implementa IDisposable, permanecerá abierta después de que se recoge la basura ...

Pero Close() y Dispose() no son lo mismo:

  • Dispose() siempre llama Close() implícita.
  • Dispose() borra ConnectionString, Close() no.
  • Si usted va a volver a abrir la conexión de nuevo, usted debe Close() no Dispose()

Y si usted elige utilizar Dispose() no lo llame direcly, la declaración using que es la mejor manera de hacerlo eso.

1

Tenga en cuenta que todo lo que Close() hace es liberar la conexión de nuevo al grupo de conexiones. Todavía notará una conexión activa a la base de datos en SQL Server. Si es necesario asegurarse de que esta se cierra, así, es posible que desee considerar ClearAllPools o ClearPool

De MSDN La agrupación de conexiones reduce el número de veces que hay que abrir nuevas conexiones.El pooler mantiene la propiedad de la conexión física. Gestiona las conexiones manteniendo vivo un conjunto de conexiones activas para cada configuración de conexión determinada. Cada vez que un usuario llama a Abrir en una conexión, el agrupador busca para ver si hay una conexión disponible en el grupo. Si hay una conexión agrupada disponible, la devuelve a la persona que llama en lugar de abrir una nueva conexión. Cuando la aplicación llama a Cerrar en la conexión, la agrupación la devuelve al conjunto agrupado de conexiones activas en lugar de cerrarla realmente. Una vez que la conexión se devuelve al grupo, está lista para ser reutilizada en la próxima llamada abierta.

+0

+1 Es bueno saber, ¿la conexión vuelve al grupo luego de un cierto tiempo de inactividad? – James

Cuestiones relacionadas