closing connection, why must be done?
vanholy Jan 13, 2005 3:34 AMOn a book i read the following example (at the bottom). I imported it in a jar than run with jboss.
The error on interroga(String str) method is:
ON CLIENT
java.sql.SQLException: Connection handle has been closed and is unusable
ON SERVER
[CachedConnectionManager] Closing a connection for you. Please close them yourself: org.jboss.resource.adapter.jdbc.WrappedConnection@594680
The problem is the that is in the apriConnessione() i got a call for make a db connection. This one is activated fist from ejbActivate(); then jboss close automatically connection without a ejbPassivate(). Then i enter in Interroga() method and the connection is no more avaible giving me exception.
I read the FAQ , expecially http://www.jboss.org/wiki/Wiki.jsp?page=WhatDoesTheMessageDoYourOwnHousekeepingMean
and so i correct the exercise putting alla connection statemente in the method interroga():
con = ds.getConnection(); & if(rs != null) rs.close(); if(ps != null) ps.close(); if(con != null) con.close();
In this case the program has no error.
BUT
I do not understand the beaviour of jboss because i studied that in ejbPassivate / ejbActivate i must close connections; not in every method!
Reading the FAQ i understand that i must open & close connection in every method.
Can you explain me why? .. or what i misunderstand :)
thankyou, Bye
package StatefulDb; import javax.ejb.*; import java.sql.*; import javax.sql.*; import javax.naming.*; public class StatefulJdbcBean implements SessionBean { private SessionContext ctx; private DataSource ds = null; transient private Connection con = null; transient private PreparedStatement ps = null; transient private ResultSet rs = null; private String cognome = null; private String nome = null; private String p_iva = null; private String cod_fiscale = null; public StatefulJdbcBean() {} public void setSessionContext(SessionContext c) { ctx=c; } public void ejbCreate(){ InitialContext initCtx = null; try { initCtx = new InitialContext(); ds = (javax.sql.DataSource) initCtx.lookup("java:comp/env/jdbc/DSCliente"); } catch(NamingException ne) { System.out.println("UNABLE to get a connection from [java:comp/env/jdbc/DSCliente]"); throw new EJBException("Unable to get a connection from [java:comp/env/jdbc/DSCliente]"); } finally { try { if(initCtx != null) initCtx.close(); } catch(NamingException ne) { System.out.println("Error closing context: " + ne); throw new EJBException("Error closing context " + ne); } } } public void ejbRemove(){ try{ chiudiConnessione(); }catch(SQLException ex){ ex.printStackTrace(); throw new EJBException("Error closing resources " + ex); } } public void ejbPassivate(){ try{ chiudiConnessione(); }catch(SQLException ex){ ex.printStackTrace(); throw new EJBException("Error closing resources " + ex); } } public void ejbActivate(){ try{ apriConnessione(); }catch(SQLException ex){ ex.printStackTrace(); throw new EJBException("Error in opening a connection " + ex); } } public void apriConnessione() throws SQLException { con = ds.getConnection(); } public void chiudiConnessione() throws SQLException { if(rs != null) rs.close(); if(ps != null) ps.close(); if(con != null) con.close(); } public void interroga(String str) throws SQLException { ps = con.prepareStatement(str); rs = ps.executeQuery(); if (rs.next()){ cognome=rs.getString("COGNOME"); nome=rs.getString("NOME"); p_iva=rs.getString("P_IVA"); cod_fiscale=rs.getString("COD_FISCALE"); } } public String getCognome(){ return cognome; } public String getNome(){ return nome; } public String getP_iva(){ return p_iva; } public String getCod_fiscale(){ return cod_fiscale; } }