¿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
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()
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.
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 ...
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
Cerrar y botar hacen lo mismo. Añadieron Close simplemente para legibilidad ya que decir que "Cerró la conexión" es más natural.
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 llamaClose()
implícita.Dispose()
borra ConnectionString,Close()
no.- Si usted va a volver a abrir la conexión de nuevo, usted debe
Close()
noDispose()
Y si usted elige utilizar Dispose()
no lo llame direcly, la declaración using
que es la mejor manera de hacerlo eso.
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.
+1 Es bueno saber, ¿la conexión vuelve al grupo luego de un cierto tiempo de inactividad? – James
- 1. Anónimo Función/Cierre y uso de uno mismo :: o estático ::
- 2. ado.net conexión de cierre cuando se utiliza el "uso" declaración
- 3. Uso de instrucción con un objeto nulo
- 4. uso de la instrucción FOR UPDATE
- 5. Uso de métodos estáticos privados
- 6. Cierre SqlConnection y SqlCommand C#
- 7. Cierre de Javascript y visibilidad de datos
- 8. Definición de cierre y ejemplo
- 9. Cierre y devoluciones de llamada
- 10. Uso de memoria al convertir métodos a métodos estáticos
- 11. Uso de la biblioteca de cierre con jsTestDriver
- 12. C++ - ¿Uso excesivo de métodos virtuales?
- 13. Uso de métodos modelo en los agregados
- 14. Cierre BufferedReader y InputStreamReader
- 15. Cierre BufferedReader y System.in
- 16. Uso de la instrucción CASE dentro de la cláusula IN
- 17. Excepción de captura dentro Uso de la instrucción
- 18. ¿Cómo uso el columpio en un gancho de cierre?
- 19. Simplemente abra y cierre la forma de diálogo winform aumentará el uso de memoria
- 20. Uso de la instrucción using con WinForms ... ¿Buenas prácticas?
- 21. Re-uso en el campo alias de instrucción SQL SELECT
- 22. simplificar la instrucción SQL mediante el uso de CTE
- 23. Cierre de declaraciones preparadas
- 24. Uso de la instrucción LIMIT en una consulta SQLite
- 25. MemoryStream en el uso de instrucción: ¿Necesito llamar a close()
- 26. Uso de comillas simples en una instrucción Exec en SQL
- 27. El uso de una cláusula HAVING en una instrucción UPDATE
- 28. Uso de una instrucción Switch en Obj-C
- 29. php include y etiqueta de cierre
- 30. Cierre de JavaScript y este objeto
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. –