estou com um problema bem complicado, o qual acredito que somente uma pessoa experiente vai saber me ajudar ou dar um norte.
O problema é o seguinte:
Estou com uma aplicação rodando em um host pago(www.webhost.com.br). Esse host me fornece um serviço de hospedagem tomcat…mysql…blah blah blah.
Só que esse host me informa que disponibiliza 256mb de memoria para o meu serviço. Eu não entendo muito bem disso, mas me pareceu que isso é bastante
comum entre os hosts que existem por ai, apesar de ainda achar uma quantidade muuuuito baixa.
Com isso, essa aplicação trava diáriamente. De repente, não se consegue mais acessar a aplicação, fica carregando infinitamente, e só volta ao normal após uma
conexão via SSH, ./shutdown.sh no tomcat, e ./startup.sh.
Isso é algo extremamente ineficiente!
Dei uma olhada nos logs do Tomcat, e tudo o que encontrei foi um error de CommonsLogger pois em algum momento a aplicação tentava setar via OGNL uma
variável int com o valor null, e ele retornada essa exception. Só que esse error se repete várias, váaááárias vezes.
Me pergunto se poderia ser isso o motivo do travamento da aplicação.
Eu fiz o tratamento de consultas, para nao deixar que nenhuma consulta acima de 5000 resultados seja feita.
Você chegou a verificar nos logs da sua aplicação rodando no servidor se apareceu alguma mensagem do tipo java.lang.OutOfMemoryError ?
Questione ao provedor, qual é a versão do java que sua aplicação está usando ? Peça ao mesmo como está sendo feita a configuração da JVM pra que comece a investigar onde está de fato o problema…
Outra coisa, sua aplicação, antes de levar ao servidor sofreu um stress test pra saber como ela se comportaria ? Se não, dá uma pesquisada sobre stress test para aplicações web.
Assim que tiver essas informações, posta aí os resultados.
60 usuários simultâneos, fazendo transações consultas no banco, etc e tal… Eu não vejo que isso possa complicar o processamento do servidor, desde que ele contenha um hardware adequado para suportar este processamento bem como se a utilização de memória na JVM estiver configurada da maneira correta. Tudo depende de como a aplicação foi projetada…
Fazer invocação do GC explicitamente também não resolve, uma vez que mesmo invocando explicitamente na aplicação, não é garantia de que a thread do GC será chamada no mesmo instante…
Já vi aplicações trabalharem com milhares de registros a serem exibidos - aplicações de grande porte - e tiveram JVM privativa de 100 MB e trabalharam bem…
Sobre a questão de Stress Test, procure saber sobre o JMeter… Na minha opinião, é uma das melhores ferramentas de stress test que pude conhecer…
Com relação ao banco de dados, a aplicação usa pool através de data source ? ou JDBC nativo ?
Esgotando todas os recursos, poderemos chegar a um consenso sobre essa questão.
Só que a utilização de recursos JDBC de forma não otimizada, pode detonar com o processamento tanto no servidor web quanto no banco de dados… Você sabe informar se o banci de dados e a application ficam no mesmo host ou são separados ?
Como sugestão, procure mudar a sua forma de conexão para pool de conexões com DataSource, usando como configuração base, o que é passado na documentação do tomcat… além de checar se as conexões com o banco estão sendo fechadas adequadamente após a realização de suas transações. Outra coisa, procure limitar o número de conexões ativas no servidor e acompanhe o desempenho de sua aplicação.
Procurando executar essas otimizações, acredito que pode haver uma melhora na sua application, antes de fazermos a “marretada” que é o reinicio diário do servidor… deixando ele pra último caso.