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 <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>**********
método destroy do servlet
Y
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
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();
}
}
Criado 12 de março de 2003
Ultima resposta 12 de mar. de 2003
Respostas 3
Participantes 4
Alura POO: o que é programação orientada a objetos? Aprenda os conceitos básicos da programação orientada a objetos, como classes, objetos, herança, encapsulamento e polimorfismo, com exemplos.
Casa do Codigo JavaScript Assertivo: Testes e qualidade de codigo em... Por Gabriel Ramos — Casa do Codigo