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