estou usando JPA + Hibernate, para realizar consultas no banco.
Com isso utilizo um pool de conexão, porem, após executar o no banco oracle, está ficando conexões inativas, o que muita vezes acaba derrubando o banco.
Alguém sabe o porque disso ?
Utilizo o método de conexão com o banco
public static EntityManager getEntityManager(){
if (entityManagerFactory == null){
entityManagerFactory = Persistence.createEntityManagerFactory("BD_CONNECT_OP");
}
return entityManagerFactory.createEntityManager();
}
Sobre o acquire_increment? Não tem “certo”, ele apenas não bate com a configuração, você está pedindo para ele fazer um incremente de 2 conexões, mas o máximo é 1, pode apenas remover ou configurar como 1. Mas isso não é o problema, o seu problema provavelmente são sessões perdidas.
Quando você usa um pool, ao fechar uma conexão no código ela não é realmente “fechada”, ela é devolvida para o pool.
O objetivo de um pool é para economia de recursos de aquisição de novas conexões, então você deveria criar o factory na primeira vez necessária, e fechá-lo quando a aplicação for encerrada. Aparentemente o seu problema está realmente nesta estrutura, pois os factories estão sendo recriados sem necessidade, precisa descobrir a causa.
Detalhe: as EMs ainda precisam ser fechadas após cada uso!
Outra pergunta: Esta aplicação tem vida curta? Executa, responde e sai?
Na verdade, eu cria uma e vou reutilizando conforme o codigo, somente se ela estiver vazia, eu crio outra.
Mais, consegui resolver o problema, verificando se a factory, está aberta, ai encerro ela e crio de novo, isso liberada as inativas do banco.
Hibernate já é um monstro, você está recriando o objeto mais pesado dele, o session factory? Se você quer efetivamente fechar a conexão com o banco de dados pra ficar usando sob demanda, feche a connection de verdade e não só a sessão gerenciada pelo Hibernate. De momento não consigo te passar como se acessa a connection pelo Hibernate do Java, mas pra te servir de pista, no C# é assim:
Então, descobri que na verdade, não a problema no hibernate, e sim no banco, pois acabei executando o mesmo processo em outro banco, melhor configurado pelo DBA, e não apresentou o problema.
Fiz uma tratativa e aparentemente está funcionando de acordo agora.
Bom que tenha resolvido o problema. Só não espere que sempre terá esse cenário garantido, se de fato fechar a conexão com o banco ficará independente disso.