Hoy he encontrado un error en uno de nuestros proyectos: hay una conexión con la base de datos que nunca se cierra, me refiero al método Close() nunca se llama. Sin embargo, cuando cierro la aplicación, la conexión se cierra (verificada en el estudio de gestión sql muchas veces). ¿Por qué?¿Qué sucede con una conexión de base de datos no cerrada?
Respuesta
La conexión se cerrará cuando la aplicación salga. Lea en SqlConnection's Finalize. De la documentación de MSDN para Object.Finalize:
"Durante el cierre de un dominio de aplicación, Finalize se invoca automáticamente en objetos que no están exentos de finalización, incluso los que todavía están accesibles."
Las conexiones SQL son costosas de crear y ADO.NET utiliza una técnica llamada agrupación de conexiones que permite reutilizarlas.
Presupuesto de MSDN:
Se recomienda encarecidamente que siempre cierra la conexión cuando termine de usarlo, de modo que se ser devuelto a la agrupación de conexiones y ser reutilizado.
Si el tamaño máximo de la agrupación ha sido alcanzado y no hay conexión utilizable es disponible, la solicitud está en cola. El agrupador intenta reclamar las conexiones hasta que se alcanza el tiempo de espera (el valor predeterminado es 15 segundos). Si la agrupación no puede satisfacer la solicitud antes de los tiempos de conexión , se produce una excepción.
De hecho, debido a la agrupación de conexiones, una conexión de SQL nunca se cierra realmente; simplemente se devuelve al grupo para volver a utilizarse cuando se llama a Cerrar. Estará cerca cuando se destruya el dominio de la aplicación que es cuando salga de la aplicación. Por lo tanto, si nunca llama a Cerrar, la conexión no se reutilizará y, una vez agotado, obtendrá una excepción. –
@ darin- nunca cerrado es incorrecto. Después de una cierta cantidad de inactividad, la conexión se cerrará, pero eso es solo una trampa. – RichardOD
@RichardOD, no diría que es quisquilloso. De hecho, no sabía este hecho. Muchas gracias por esta precisión. –
Cuando salga de la aplicación de manera normal, espero que se ejecuten los finalizadores. Cerrarán la conexión si aún está abierta. Simplemente no dependa de esto: puede pasar un tiempo antes de que esos finalizadores se ejecuten en el funcionamiento normal de su aplicación, por lo que mantendrá demasiadas conexiones abiertas.
Cuando la aplicación falla, quizás el finalizador no se ejecute, dejando la conexión abierta más allá de la duración de la aplicación.
Otra cosa a tener en cuenta aquí es que en .Net, puede envolver sus conexiones en un bloque de uso, y eso cerrará y eliminará sus conexiones por usted. Por lo que la falta de una explícita Cerrar() no es una mala cosa si usted tiene sus utilizando bloques de allí ...
// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
conn.Open();
// database code here with no explicit close
}
que es el equivalente funcional de un try/finally con un conn.Close en el finalmente. Muchos desarrolladores pasan por alto los bloques de uso; asegúrese de que no esté haciendo lo mismo en este caso.
Si reescribes el código para cerrar tus conexiones, es una buena práctica usar el uso de bloques alrededor de todos tus objetos de base de datos (conexión, comando, lector) para asegurarte de que están cerrando y eliminando cuando caigan fuera del alcance del bloque de uso. Definitivamente, sugeriría escribirlos en tu código en lugar de solo conn.Close() donde sea necesario.
- 1. Conexión de la base de datos MySQL no cerrada: ¿qué pasará?
- 2. Conexión de la base de datos cerrada inesperadamente con Glassfish, jTDS y SQL Server 2008
- 3. NIO - Detectando una conexión cerrada
- 4. Qué sucede si dejo abierta una conexión de base de datos en una página web de ASP.NET
- 5. IllegalStateException: base de datos ya cerrada (con ViewPager)
- 6. Oracle DB: java.sql.SQLException: conexión cerrada
- 7. ¿Qué sucede si no comprometes una transacción a una base de datos (por ejemplo, SQL Server)?
- 8. conexión tiene una base de datos remota
- 9. ¿Qué sucede con una base de datos Sqlite cuando se elimina la aplicación?
- 10. ¿Qué pasa si no cierra la conexión de base de datos SQLite en Python
- 11. una conexión existente forzosamente fue cerrada por el host remoto
- 12. HibernateOptimisticLockingFailureException marca la conexión como 'cerrada'?
- 13. ¿Qué sucede con una transacción no confirmada cuando se cierra la conexión?
- 14. Android: excepción de estado ilegal de base de datos SqLite (base de datos ya cerrada)
- 15. Excepción común de WCF: conexión inesperadamente cerrada
- 16. Conexión de base de datos heterogénea
- 17. informes de Crystal - cerrar la conexión de base de datos
- 18. Detectar conexión de navegador cerrada en PHP
- 19. log4net a SQLServer: ¿qué sucede si la base de datos no está disponible?
- 20. ¿Ciclo de vida de la base de datos Sqlite? ¿Se borra cuando la aplicación está cerrada?
- 21. Conexión agrupación con la base de datos de Access
- 22. ¿Qué sucede cuando las conexiones a MongoDB no están cerradas?
- 23. conexión de base de datos jndi con jpa y eclipselink
- 24. Apache Camel: por qué la conexión TCP no está cerrada después de recibir 200 OK
- 25. Cómo obtener la conexión Cadena de una base de datos
- 26. Conexión JPA con la base de datos H2
- 27. ¿Por qué siempre cerrar la conexión de la base de datos?
- 28. ¿Qué sucede con una consulta si se agota el tiempo?
- 29. ssh conexión localhost cerrada por 127.0.0.1?
- 30. ¿Qué tan seguro es "git" con una conexión no confiable?
"Si el SqlConnection queda fuera del alcance, no se cerrará. Por lo tanto, debe cerrar la conexión de forma explícita llamando a Close o Dispose". -esto es también de msdn, ¿no significa que la conexión puede no cerrarse si no llamas a Close()? – agnieszka
Básicamente puedes hacer Close, Dispose o usar() {}, como deberías hacer de todos modos. Cuando la aplicación se cierre, las conexiones también se cerrarán, por la razón que he indicado en mi respuesta. – RichardOD
Además, si en algún momento el GC decide finalizar las conexiones, también se cerrarán. – RichardOD