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

4 respostas
C

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?

4 Respostas

Rafael_Nunes

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

C

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

Como faço isso?

C

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

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.

C

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).

Criado 18 de agosto de 2009
Ultima resposta 21 de ago. de 2009
Respostas 4
Participantes 2