método destroy do servlet

3 respostas
Y
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  o código abaixo:





***********


import <a href="http://java.io">java.io</a>.<em>;


import javax.servlet.</em>;


import javax.servlet.http.<em>;


import java.util.</em>;


import java.sql.<em>;











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;


    }





    /</em> Connect to the database <em>/





    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 !" );


      }


   }


}











</em>**********

3 Respostas

A

Eu usaria o finally para fechar a conexão!



[]´s

Dalton

J

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…

H
 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();


      }


   }
Criado 12 de março de 2003
Ultima resposta 12 de mar. de 2003
Respostas 3
Participantes 4