JPA(EntityManager) com OpenSessionInView

Estou com um grande problema…

Tenho uma web app que utilizava um camada de persistencia que se preocupava em realizar todo e qualquer coisa de acesso ao banco de dados, em outro projeto tenho as famosas classes DAO onde estão as minha JPQLs.

Na web app utilizo o C3P0, como recomendações da propria documentação do hibernate e outras informações, foi configurado certinha com os valores default, que são do minimo de conexões 3 e maximo 20, e todos outros valores padroes do C3P0.
A nossa persistencia foi ficando obsoleta e precisamos de maior controle, por isso retiramos o controle dela, disponibilizando um acesso ao EntityManager que ela utiliza.

Ai começaram os problemas, a nossa applicação dependia em muita da persistencia que se encarregava em abrir e fechar os EM(EntityManagers). Como o projeto de nossa persistencia foi descontinuado, tivemos que realizar essa acesso externo.

Como a aplicação inteira estava dependendo desse controle da persistencia, que não existe mais, precisa de um solução que abstraisse o controle de abrir e fechar os ‘EM’ sem que a camada de visão, ou as camadas mais altas estivesse sabendo.

Então lembri do padrão openSessionInView, ou seja, conseguiria abrir e fechar os meus EntityManager de acordo com cada requisição ao sistema e poderia gerir isso de maneira mais adequada com um filter ou interceptor, e fazer um CDI com o ‘EM’ para as camadas da aplicação sem me preocupar em abrir ou fechar transações tambem, e com poucos riscos de tomar uma Exceptio de Lazy de algumas Entity.

O problema fica pior quando alguns poucos usuarios conectam e começam a usar o sistema por inteiro, ai o numero de conexões do C3P0 vai alem de 20, e conseguentemente ele espera que mais um conexão além dos 20 e então entra no modo de esperar, esperando uma conexão e travando a aplicação inteira. Ou seja, seria um problema de connectionLeak e tambem de memoryLeak, por ficar referencias do ‘EM’ na persistencia e na aplicação.

Precisaria de algo com o menor impacto para a applicação e que fosse mais rapido de alteração, mas tambem gostaria da solução ideal(qual seria a melhor pratica, quando um projeto está no começo?). Pensei no openSessionInView devido a esses fatores que menceionei, embora der um pouco de trabalho realizar as refatorações, mesmo assim, valeria a pena.