Estou fazendo um site usando JPA, mas um problema que estou tendo é que, quando coloco o site no ar, depois de algumas horas, algum problema acontece na conexão com o banco, dá algum problema numa transaction, que fica lançando exceção.
Para voltar ao normal eu tenho que reiniciar o Tomcat.
Estou usando somente um mesmo EntityManager para a aplicação inteira (Singleton), portanto, quando dá um erro, eu já não consigo entrar em nenhuma página do site.
Se eu ficar dando um “entityManager.close();” no bloco finally de cada método service acho que resolve o problema, mas aí eu irei perder o cache que o EntityManager gera automaticamente para mim.
Alguém tem alguma sugestão para resolver o problema?
Só isso. Sempre funcionou no ambiente de desenvolvimento. Na hora que foi para produção, depois de algumas horas no ar, dá algum problema numa transação que trava tudo, quando tenta dar transaction.begin(). Daí eu tenho que ficar reiniciando o Tomcat sempre quando dá aquela exceção.
Acho que primeiro dá uma exceção de Transaction Already Active, no transaction.begin(). Depois começa a dar exceção de Broken Pipe.
cara, muito estranho. aparantemente está tudo ok.
o banco nao está caindo ? verifica o uptime do banco quando ocorre esse erro. se estiver sua aplicacao não pode garantir isso.
ou até mesmo uma instabilidade da rede.
nesse caso, você pode configurar um pool para recriar as conexões quando fecharem.
Olhando os logs to Tomcat, vi que logo antes de dar as exceções de Broken Pipe, a primeira exceção que dá é:
SEVERE: Servlet.service() for servlet default threw exception
org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1575)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1324)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:354)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:258)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2213)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:65)
at br.com.meusite.service.UsuarioService.findUsuarioByLogin(UsuarioService.java:61)
Ou seja, parece que a conexão foi derrubada por algum motivo.
Agora eu configurei o JPA para usar o pool do c3p0, vamos ver se resolve… Já coloquei o site no ar, agora é esperar para ver se o site vai durar muito tempo sem cair a conexão…