Aquí está el flujo de eventos para ilustrar lo que está sucediendo:
- La persona que llama solicita y utiliza una conexión (aplicación o conjunto de conexiones)
- La persona que llama mantiene una referencia para que la conexión se pueda reutilizar
- La persona que llama pasa por un período de inactividad (por ejemplo, un sistema de desarrollo durante la noche o un sistema de control de calidad durante el fin de semana).
- Una vez que la conexión a la base de datos no está en uso, la base de datos considera que la conexión está inactiva. Debido a que está inactivo, después de una cierta cantidad de tiempo (el valor predeterminado de MySQL es de 8 horas), la base de datos cierra la conexión.
- La persona que llama todavía tiene un identificador de la conexión, y cuando la persona que llama intenta usar la conexión nuevamente, descubre desagradablemente que la conexión se ha cerrado.
La razón por la que autoReconnect=true funciona, y por la que el grupo prueba la validez de la conexión funciona, es que está instruyendo al sistema que llama para que pruebe la conexión en esta situación y que lo intente nuevamente si ocurre esta situación.
En cuanto a si la consulta de validación afectará el rendimiento:en teoría, está utilizando una conexión para hacer algo. En la práctica, algo es tan trivial que su efecto es insignificante en el contexto de todo su sistema.
[EDITAR]
En este caso, Apache DBCP es el conjunto de conexiones que se aferra a la conexión, pero NO desea que DBCP cierre la conexión después de cada llamada. El objetivo del grupo de conexiones es mantener una conexión lista para la próxima llamada porque crear conexiones es costoso. Los objetos de conexión mantenidos por el grupo están respaldados por conexiones de base de datos reales, y la base de datos es la que cierra esa conexión real después del período de tiempo de inactividad. Tenga en cuenta que el tiempo de espera para cerrar las conexiones inactivas se configura en la base de datos, no en el grupo de conexiones. Debido a esto, DBCP no tiene forma de saber si la conexión se ha cerrado o no, a menos que realmente intente conectarse con ella. Es por eso que necesita una consulta de validación.
Para obtener más información sobre la configuración de DBCP, consulte la página de configuración y los documentos API .