Respecto a cortarse... puede ser que grabar el fichero tarde "demasiado" y el navegador "se canse" de esperar una respuesta y por eso de el timeout. ¿Te serviría devolverle directamente el fichero desde la conexion JDBC? Así empezarías a responder en seguida, y de hecho no es tan complicado.
Respecto a errores impredecibles, null pointers etc... yo creo que empezaría de cero, haría un simple servlet que descargue el fichero desde la conexion JDBC y me olvidaría de los taglibs y lo que hacen. Creo que los problemas te vienen de ahi, de coger codigo que se usa de otra forma e intentar adaptarlo.
En realidad un servlet que descargue un fichero es muy sencillo y no necesita tanto lio

.