cerrar la conexion en un bean con scope=session

aitor
28 de Septiembre del 2004
buenas.

estoy programando una aplicacion que utiliza varios beans y jsps. uno de los beans tiene scope=session durante toda la aplicacion y en el constructor abre una conexion a una BD. sin embargo, al finalizar la aplicacion me gustaria poder cerrar esa conexion y no se como. alguien me puede ayudar?

gracias, agur

guavita
28 de Septiembre del 2004
Bien, en primer lugar debes usar la especificacion de Java Servlets 2.3. Crea una clase que implemente la interfaz HttpSessionListener. Esta clase tiene un método que se invoca automáticamente al cerrar la sesion. Envíame un mail y te explico en detalle.
pd.
El metodo de HttpSessionListener es public void sessionDestroyed(HttpSessionEvent e) . En el debes cerrar la conexion, Lo ideal es que tu oyente de Sesiones sea un Bean con alcance de aaplicacion scope='application'.

imaz
28 de Septiembre del 2004
Aupa.

Puedes crear un metodo en el Bean, ejem:
public void CerrarCon()
{
nombre_conexion.close();
}

En el jsp
<% nombre_Bean.CerrarCon();%>

Es una forma, a mi no me gusta. Prefiero abrir la conexion, sacar los datos, enviarlas al jsp y luego cerrar la conexion.

agur

aitor
28 de Septiembre del 2004
aupa

eskerrik asko erantzuteagatik. el problema es que el bean tiene scope=session y si cierro la conexion y luego voy a otra pagina no se ejecuta el constructor del bean (y la conexion esta cerrada). he probado a implementar el metodo finalize() pero no se si funciona muy bien.

lo que dices tu tambien he probao. lo que pasa es que ese bean comparte datos con otros beans con scope=page, incluida la propia conexion, y la conexion debe permanecer abierta.

de todas formas eskerrik asko.
agur

imaz
28 de Septiembre del 2004
Bien, en vez de usar el constructor para hacer la conexion, crea un metodo para hacer la conexion.
El constructor se ejecuta cuando creas el objeto y creo que tu lo haces una vez en toda la aplicacion.

es cuestion de probar.

Ruben
28 de Septiembre del 2004
Existe una interfaz q se llama HttpSessionBindingListener
la cual debes implemetar desde el Bean. La cual te cierra la conexion al cerrar el navegador. Por van los tiros yo por hay ando, tengo un problemilla de ese estilo asi q si consigues algo te agradeceria q me mandaras algo

maramonar
28 de Septiembre del 2004
El tema es que cerrar el navegador no hace que se cierre tu sesión en el servidor. Si se cierra el navegador la sesión se cerrará recién cuando llegue al timeout establecido. Para liberar recursos lo que hemos hecho es tener en todas las paginas un Logout que cierra la sesión y libera recursos y para los usuarios "rebeldes" que cierran directamente el browser tenemos una implementación de la interfaz HttpSessionListener. A estos listeners se les notifica sobre eventos de creación y destrucción de los objetos HttpSession, entonces en el método sessionDestroyed(HttpSessionEvent se) podrías liberar los recursos. De todas maneras, coincido con alguna respuesta anterior que menciona que lo ideal sería obtener y liberar la conexion a la DB cada vez que terminas de ejecutar un método.