WebService perde conexão com o BD! [RESOLVIDO]

Bom dia pessoal.

Há alguns dias estou com um problema muito estranho.

Fiz um webservice que busca os dados em um banco ORACLE com hibernate, usando o pool c3p0. O aplication server que estou usando é o Tomcat.

A princípio o serviço funciona normalmente. O problema é que no dia seguinte (acredito que seja por causa da rotina de backup na madrugada) sempre recebo a mensagem “Cannot open connection”. Fui no catalina.out (onde estão sendo impressas as StackTrace’s) e encontrei o seguinte:

[ERROR] Cannot open connection
org.apache.axis2.AxisFault: Cannot open connection
        at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:158)
        at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
        at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
        at org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:135)
        at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
        at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:838)
        at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:262)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)
        at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
        ... 21 more
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
        at org.hibernate.loader.Loader.doQuery(Loader.java:673)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.doList(Loader.java:2220)
        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 br.gov.mpf.prrj.webservice.consultaprocessual.servico.persistencia.DAO.getLista(DAO.java:86)
        at br.gov.mpf.prrj.webservice.consultaprocessual.servico.MovimentacaoProcessual.getMovimentacao(MovimentacaoProcessual.java:29)
        ... 27 more
Caused by: java.sql.SQLException: No more data to read from socket
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
        at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1160)
        at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:963)
        at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:893)
        at oracle.jdbc.ttc7.Ocommoncall.receive(Ocommoncall.java:104)
        at oracle.jdbc.ttc7.TTC7Protocol.setAutoCommit(TTC7Protocol.java:559)
        at oracle.jdbc.driver.OracleConnection.setAutoCommit(OracleConnection.java:1288)
        at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
        at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:61)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
        ... 42 more

O problema se resolve simplesmente ao reiniciar o contexto.

Alguém tem alguma sugestão do que pode ser o problema?

Já setei até a propriedade hibernate.c3p0.acquireRetryAttempts para ilimitado (achando que poderia ser algum problema de conexão entre o pool e o banco depois que ele sai do ar para o backup), mas nada resolveu.

O que acham?

Tenta deixa o pool de conexões no container, e no Hibernate carrega só pelo datasource.

[quote=Rafael Nunes]Tenta deixa o pool de conexões no container, e no Hibernate carrega só pelo datasource.
[/quote]

Como faço isso?

[quote=Rafael Nunes]Tenta deixa o pool de conexões no container, e no Hibernate carrega só pelo datasource.
[/quote]

Achei um artigo ensinando o lance do datasource: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

Vou tentar aqui e qualquer coisa volto.

Obrigado pela rápida resposta.

Colocar simplesmente a conexão no contexto não funcionou. Tive o mesmo problema após perder a conexão.

Além de colocar a conexão no contexto (ou melhor um SessionFactory), eu tive que usar o c3p0 para gerenciar o pool de conexões e adicionar um arquivo c3p0.properties no CLASSPATH do webservice (pasta WEB-INF/classes) com as seguintes propriedades:

c3p0.acquireRetryDelay=1000
c3p0.acquireRetryAttempts=0
c3p0.breakAfterAcquireFailure=false

Fica aí a solução para quem tiver o mesmo problema.

PS: Ah é, não esqueçam que os arquivos properties terminam com uma linha em branco (dê um depois da última propriedade).