Cita: En definitiva lo que yo había leído es que las conexiones se cierran solas al finalizar el script si la conexión no es persistente. Las conexiones que uso no son persistentes.
Uno de los errores es confundir el cierre de una conexión con la liberación de recursos de la conexión, y también confundir conexión a la base de datos con enlace TCP/IP. Son cosas diferentes.
El que una conexión se cierre no implica la liberación de los recursos de sistema operativo usados en forma instantánea. El S.O. se toma cierto tiempo en liberar los recursos que usó para la conexión. Por eso es que el pool de conexiones de Windows puede llegar a saturarse sin necesidad de demasiada exigencia.
Por otro lado, la conexión a la base puede caerrse simplemente por cambiar de página en el navegador, mientras y la base queda esperando, con la conexión en estado
sleep, lo que implica que puede seguir existiendo por un tiempo.
En el otro orden, el enlace TCP/IP no se pierde tan rápidamente, y como en enlace a la página se cuenta en los hosting como algo separado del uso de la base, eso también afectará el servicio que te den.
Resumiendo: La buena práctica sería:
1) Una conexión por sesión de usuario.
2) Verificar el estado de la conexión siempre, antes de enviar una consulta a la base.
3) Cerrar el enlace si y sólo si se ha cerrado la sesión, o la misma ha caído.
4) Si es un usuario genérico, lo conveniente es que al inicio de una sesión, el sistema verifique si hay conexiones a la base dormidas (sleep) y huérfanas, y luego las elimine. (esto lo agrego ahora,porque lo había olvidado

)