Si ocurre una excepcion ejecutando el codigo o cerrando el resultset o el prepared statement, la conexion nunca se cierra/devuelve al data source.
Aunque lo hagas "despues" el codigo no tiene que para por ConnectionFactory.closeConnection(conn); puesto que esta instruccion esta fuera del finally. Asi que cualquier excepcion se la salta.
Así que creo que veo perfectamente
.
S!