Servlet y BD

EDU
27 de Febrero del 2006
Hola a todos,
Tengo una aplicacion con bastantes servlets, en todos sigo la misma tonica en el metodo init() llamo a un metodo de una clase de apoyo q crea la conexion con la Base de datos Oracle y en el destroy() llamo a otro metodo q cierra la conexion con la BD.
La duda q tengo es si es recomendable cerrar la conexion con la BD en el metodo destroy(), xq hasta q no reinicio el tomcat no entra en este metodo.
Me han entrado las dudas xq mi aplicacion ha fallado dando excepcion sql: ORA-01000: maximum open cursors exceeded
Gracias!

neossoftware
27 de Febrero del 2006
Hola que tal:

En efecto tu aplicacion en ese aspecto esta un poco ineficiente, ya que no es muy recomendado que abras la conexion en el metodo init() y despues la cierres en el metodo destroy(), bueno aqui voy con mi explicación de como es podrias tener un mejor diseño para accesar a la base de datos y que no se te cuelguen las conexiones:

En primer lugar para accesar a la base de datos deberás de utilizar el patron DAO

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Este patron te va a servir para manejar de una forma ordenada y clara todo lo que tenga que ver con la BD.

Ahora para abrir las conexiones a la Base lo que te recomendaria es configurar un Pool de COnexiones en el servidor de aplicaciones, usando este solo una vez se autentifica y las demas peticiones son muy rapidas ya que no se tiene que autentificar, no se si estes usando DriverManager para recuperar las conexiones, si es asi por cada getConnection se tiene que autentificar en la Base y eso le quita performance, ahora en donde cerramos la conexion

loos bloques de codigo quedarian asi:

public class ConnectionManager {

public static Connection getConnection() {

try {
Context context=new InitialContext();
DataSource ds=(DataSource)context.lookup("jdbc/MyConnection");

Connection conn=ds.getConnection();
return conn;

}catch(SQLException e) {


}
}

}

en El dao usas ConnectionManager:

try {

Conn conn=ConnectionManager.getConnection
/// ....
////usas la conexion

}catch(SQLException) {

}finally {
conn.close(); --->Aqui cerramos la conexion
}


Con esto te aseguro que no tendras poblemas, ni de performance ni nada, esto lo usamos en el BAnco Local del Mundo y nos funciona perfectamente.

Saludos!!!!

EDUa
27 de Febrero del 2006
GRACIAS!!
Investigare lo q me has comentado e intentare implemetarlo...

Un saludo!