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.
A exceção é essa:
java.net.SocketException: Broken pipe
java.net.SocketOutputStream.socketWrite0(Native Method)
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
java.net.SocketOutputStream.write(SocketOutputStream.java:136)
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
org.postgresql.core.PGStream.flush(PGStream.java:532)
org.postgresql.core.v3.QueryExecutorImpl.sendSync(QueryExecutorImpl.java:674)
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:189)
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:354)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:258)
org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
org.hibernate.loader.Loader.doQuery(Loader.java:674)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
org.hibernate.loader.Loader.doList(Loader.java:2213)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
org.hibernate.loader.Loader.list(Loader.java:2099)
org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:65)
br.com.meusite.service.UsuarioService.add(UsuarioService.java:290)
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?