Existe alguma maneira de impedir que uma sessão hibernate consuma toda a memória do servidor? O caso é o seguinte:
Descobri uma erro de lógica em uma consulta que estava trazendo todos os registros de umas tabelas (milhões de registros), e com isso toda a memória ia sendo consumida, até derrubar a aplicação. O erro de lógica foi sanado, mas me gerou a preocupação de impedir que isso ocorra novamente, partindo do princípio que uma sessão sozinha, mesmo que faça uma consulta gigante, não pode consumir toda a memória do servidor a ponto de comprometer a aplicação… existe alguma maneira de evitar isto?
Se realmente tem motivos para usar o pesado Hibernate, tem que considerar os custos para saber domar uma ferramenta tão complexa. Do contrário, se livre disso.
Em relação a prevenção, testes funcionais automatizados simulando os piores cenários costumam prever problemas antes de acontecer produção.
uma boa suite de testes onde vc pode, antes de um release ou durante a noite ( ai entra o conceito de nightly build ) faz um mega teste com um banco de dados parrudo e ve se a aplicação vai pro espaço. pode ser tão simples quanto vc reproduzir este problema ( meter milhões de registros e executar aquele procedimento, se a logica mudar este teste vai falhar )
configuração da aplicação:
coisas como
"hibernate.query.plan_cache_max_soft_references"
“hibernate.query.plan_cache_max_strong_references”
vc pode evitar que ele tente pegar milhares de coisas e mandar a memoria pro beleleu
rode seus testes manuais ou automatizados também com um profiler de memoria e estude o que acontece. um bom profiler e testes por algumas horas pode mostrar se a memoria cresce desenfreadamente.
estude o que vc pode fazer no seu garbage collector em termos de fazer um fine tunning nas configurações caso vc tenha uma situação especifica ( vc cria muitos objetos pequenos? cria poucos grandes ? aqui vale um pouco de pesquisa e investigação )
procure erros bobos como concatenação de strings com + ao inves de usar um String Builder, preste atenção em JNIs se vc tiver ( pode ser fonte de memory leak se eles alocam memoria mas não desalocam), etc.