método destroy do servlet

Eu tenho um servlet que usa os métodos init e destroy… no init eu conecto ao banco de dados e no destroy eu desconecto do banco de dados.

De acordo com a minha rotina, eu chamo o método init, depois chamo uma consulta se a consulta retornar algum valor eu redireciono a uma outra página, sendo q o método destroy se encontra na página q eu fiz a consulta. O código funciona q é uma beleza, porém as conexões ficam abertas no banco de dados… olha só o código abaixo:



***********

import java.io.;

import javax.servlet.
;

import javax.servlet.http.;

import java.util.
;

import java.sql.;







public class Checamatricula extends HttpServlet {



String matricula;

boolean retorna;

Connection con = null;

private Driver driver;

private String lastErr;





public void init( ServletConfig config ) throws ServletException

{



// Faz a conexão com o banco de dados sqlserver



try {

driver = (Driver) Class.forName("com.internetcds.jdbc.tds.Driver").newInstance();

}

catch (Exception e) {

lastErr = "Cannot load the driver, reason:"+e.toString() +

"Probably the com.internetcds.jdbc.tds.class is not in the servlet engine classpath";

return;

}



/
Connect to the database /



String sHost = "10.30.2.8"; // The local machine (localhost)

String sConnect = "jdbc:freetds:sqlserver://"+sHost+":1433/servidordb";

try {

con = DriverManager.getConnection(sConnect,"usrhelpdesk","helpdesk");

}

catch (SQLException e) {

lastErr = "Cannot connect to "+sConnect+", reason:"+e.toString();

}

}





public void doPost( HttpServletRequest req,HttpServletResponse res )

throws ServletException, IOException

{







// Pega os dados do formulário



matricula=req.getParameter("matricula");



PrintWriter output = res.getWriter();

res.setContentType( "text/html" );



// Testa se a matrícula existe



boolean sucesso=consulta();

if (sucesso)

{

HttpSession session = req.getSession();

session.setAttribute("matricula",matricula);

res.sendRedirect("…/helpdesk/chamada.jsp");

}

else

{

output.print("<H2>Funcionário não encontrado !</H2>");

output.print("<H2><a href="…/helpdesk/validamatricula.jsp"> <font face="Arial, Helvetica, sans-serif" color="#FF0033" size="2">Retornar</font></a></H2>");

}

output.close();

}



private boolean consulta()



// Classe que consulta se o funcionário existe



{

int i=0;



try

{

Statement st = con.createStatement();

ResultSet dados=st.executeQuery("SELECT * FROM funcionario where matricula=´"+matricula+"´");

while(dados.next())

i++;

if (i==0)

retorna = false;

else

retorna = true;

}



catch ( Exception e )

{

e.printStackTrace();

con = null;

System.err.println("ERROR: Erro na consulta !");

System.err.println(e.toString());

return retorna;

}

return retorna;

}





public void destroy()

{

try

{

con.close();

}

catch( Exception e )

{

System.err.println( "Problema ao fechar o banco de dados !" );

}

}

}







**********



Eu usaria o finally para fechar a conexão!



[]´s

Dalton

Salvo engano, o destroy é chamado apenas quando o Container vai retirar o servlet da memoria. Ou seja, ia demorar um bocado para fechar a conexao. Tente usar o finally como o Dalton sugeriu.



valeuz…

Só complementando o que foi dito…



O método init, assim como o destroy, é chamado somente uma vez.



Em caso de erro numa servlet, eu recomendo lançar uma ServletException para informar automaticamente o sistema de log do container.



Recomendo fechar sempre os objetos Statement, isso ajuda a manter a heap enxuta.



Exemplificando:



public void doGet(…) …

{



Connection con = …;

try

{

con = …

Statement stmt = con. …



stmt.close();



}

catch(SQLException e)

{

throw new ServletException(e);

}

finally

{

con.close();

}

}