Métodos init e destroy no Servlet

6 respostas
W

Pessoal, no meus servlets uso os métodos init e destroy para abrir e fechar a conexão com o banco, respectivamente. As chamadas a esses métodos é totalmente implícita, ou seja, quando o servlet é invocado o método init é invocado e quando o mesmo termina sua execução o método destroy é invocado. Que o método init é chamado estou certo que sim, pois a conexão é estabelecida sem nenhum problema. Minha dúvida é quanto à chamada do método destroy, se é implícito tambem. Meu servidor de aplicações me dá estatistística de conexões JDBC solicitadas e ainda abertas e sempre aparece conexões como abertas. Minha dúvida é: será que a conexão está realmente sendo fechadas no método destroy. Alguém pode me ajudar ?

6 Respostas

maresp

É importante lembrar que o método destroy() somente será invocado quando você der shutdown no servlet container. Seu servlet extends HttpServlet não é isto? Também vale lembrar que a classe HttpServlet é um Singleton e só existe uma instância do seu servlet no container que “sobrevive” enquanto seu container estiver no ar.
Não sei como funciona sua aplicação, mas qual o motivo de conectar-se ao db dessa forma?

W

Desculpe, mas não entendi bem a resposta, pode explicar com mais detalhes ? No meu servlet eu recebo os valores que vem do meu form html, conecto no banco , chamo uma function no banco que insere os dados retornando um status(ok ou falha) e então fecho a conexão com o banco no método destroy, que é minha dúvida ? Há uma maneira mais fácil de fazer isso e eu ainda não sei ?

maresp

Vc só precisa entender que após o seu servlet processar o request e retornar alguma coisa para o browser ele (o servlet) ainda existe… O servlet não é instanciado no momento que vc submete seu form, ele é instanciado qdo vc inicia seu servlet container (tomcat? qual vc usa?). Da mesma maneira ele só terá seu método destroy() invocado quando vc para o container.

Tente controlar a conexão manualmente chamando os métodos vc mesmo em momentos específicos, ou seja, somente quando for necessário fazer uma operação no banco de dados.

W

Toda vez que chamo o servlet preciso fazer essa conexão ao banco…Uso como servlet container o Resin. Dentro do meu servlet eu tenho um métodos que irá invocar a funtion no banco…seria melhor eu fechar a conexao neste método assim que retornar da execução da function e não deixar pra fechar no destroy ? Assim eu garantiria que conexao foi fechada…correto ou nao ?

maresp

isso mesmo…

Bani

Você tem certeza que quer ficar abrindo e fechando a conexão a cada chamada do método?
Se você realmente quer isso, tudo bem, faça assim. Mas se for uma conexão usada com uma certa frequencia é melhor deixar aberta mesmo, ou ter um pool de conexões, porque essa operação de abrir e fechar a conexão com o banco tem um impacto relativamente alto em performance.

Criado 8 de agosto de 2003
Ultima resposta 8 de ago. de 2003
Respostas 6
Participantes 3