Lentidão e Congelamento na Aplicação JSP

Dae pessoal, estou pedindo socorro pela primeira vez, mas é que não sei mais oq fazer. Bom, tenho uma aplicação JSP, com acesso a banco, claro. A Aplicação é rápida no começo, depois começa a ficar lenta, e as vezes até trava, congelando, só voltando ao normal quando se reinicia a aplicação pelo tomcat. Assim, de maneira bem geral, existe alguma dica para aplicações JSP com acesso a banco para evitar lentidão?

bem-vindo ao Portal Java… cara, se não tem nenhum erro pra mostrar pra gente, alguma pista, fica difícil, tu vai ter q fazer uma caixa preta ai e procurar o gargalo… colocar logs, etc… será q não é algum SQL demorado? O pool ta bem configurado? etc…

Cara, não existe erros. Simplesmente fica muito lento, as vezes congelando tudo… Bom, POOL, fiquei boiando, pode dar mais detalhes sobre isso? O que posso dizer é que a aplicação torna-se muito lento quando o processo do JAVA chega em torno de 70.000k de uso de memória. Fique analizando o uso de memória dos processos, ontem. Parece ser muito, por que é bem maior de todos os outros processos.

por pool, eu quis me referir ao pool de conexões com o banco, tu usa um pool ou tem uma classe q faz essa conexão pra ti? Bem… é claro q tem erro né, se não tivesse a gente não ia ta procurando uma solução hehehe :slight_smile: … seguinte, tu tem q achar um gargalo no código, loop infinito, método q não retorna, sql mal feito… tem q procurar um gargalo… é oq posso falar, não sei te dizer onde esta o erro :roll:

É, não teríamos pq estar procurando a solução… hehehe. É que quis dizer que não existem erros aparentes.
Mas sobre conexão com banco, não uso pool, nem uma classe específica. Faço a conexão no metódo init do meu servlet. Ainda existem outras duas classes que fazem a conexão no seu construtor quando são chamadas. Mas são chamadas em duas páginas, somente.
Não sei se pode ser isso. Eu estava chutando em memória.

Porque vc não faz a conexão apenas uma vez quando sobe seu servidor de aplicações/web? Pode ser este o gargalo a que o Matheus havia se referido.

Cara, desculpa a ignorancia. Mas como faço isso?

Ele quis dizer pra ti fazer essa conexão somente 1x, e compartilhar a referencia a essa conexão entre os objetos…

Soh sei como fazer isso pra servidor Web, como o Tomcat por exemplo. Num sei se daria pra um Jboss…

Dah uma olhada na interface ServeletContextListener, método contextInitialized()… esse método eh chamado sempre q vc sobe seu servidor de aplicações. Vc precisa criar uma classe implementando essa interface e falar pro Tomcat que ela eh um “ouvidor de contexto” através do web.xml, por exemplo:

<listener>
<listener-class>
com.example.MyServletContextListener
</listener-class>
</listener>

nesse listener vc criaria a conexão no contexto e poderia reutilizá-la sempre q precisasse. Agora, não sei qual a implicação de uma quantidade grande de clients utilizando a mesma conexão.

Hmmm, entendi… Minha dúvida é a seguinte: oq é melhor? Ter uma unica conexão pra toda aplicação? Ou abrir e fechar conexões sempre que necessário?

Nessa solução, de uma unica solução para toda aplicação, eu instancio ela dentro da classe que implementa ServletContextListener no método contextInitialized e fecho ela no metódo contextDestroyed. É isso?
Mas como eu referencio ela dentro do servlet, e outras classes?

Muitas perguntas… hehehe…

o ideal é vc usar um pool de conexões, configurando-o no seu container. Veja na documentação do container q estiver usando (ou pesquise aqui no fórum mesmo, é simples)… e, dica: de uma olhada no pattern DAO

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Se você deixar uma conexão só, pode acontecer do banco fechar essa conexão por timeout.
o ideal é ter um pool de conexões…