2016-02-22 168 views
0

我在应用程序服务器上运行的Web服务GlassFish Server开源版本4.0(内部版本89)/ JDK 1.7.0_79 /驱动程序ojdbc14.jar/S.O:Windows Server 2008 R2 Standard。问题是这样的,我在同一个应用程序服务器配置的JDBC连接池,然后我发现了以下错误(在白天间歇性地出现此错误):java.sql.SQLException:关闭连接

值java.sql.SQLException:关闭连接 在oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) 在oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) 在oracle.jdbc.dbaccess.DBError.throwSqlException(DBError .java:269) at oracle.jdbc.driver.OracleConnection.privateCreateStatement(OracleConnection.java:845) at oracle.jdbc.driver.OracleConnection.createStatement(OracleConnection.java:799) at com.sun.gjc.spi .ba (ConnectionHolder.java:256) at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.createStatement(ConnectionWrapper40.java:75) at br.com.todo.ws.CallbackNaFilaService.consultarParametros(CallbackNaFilaService。 java:654) at sun.reflect.GeneratedMethodAccessor113.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606 ) at org.glassfish.webservices.InstanceResolverImpl $ 1.invoke(InstanceResolverImpl.java:143) at com.sun.xml.ws.server.InvokerTube $ 2.invoke(InvokerTube.java:149) at com.sun.xml .ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:88) at com.sun .xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050) at com.sun.xml .ws.api.pipe.Fiber.doRun(Fiber.java:1019) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877) at com.sun.xml.ws .api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:136) at org.glassfish.webservices.MonitoringPipe.process(MonitoringPipe.java:142) at com.sun.xml.ws.api.pipe.helper .PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136) at com.sun.xml.ws.api.pipe.Fiber ._doRun(Fiber.java:1050) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019) at com.sun.xml.ws.api.pipe.Fiber.ru nSync(Fiber.java:877) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:136) at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest( CommonServerSecurityPipe.java:210) at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:142) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter。 java:119) at com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java: 1050) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877) at com.sun.xml.ws.server.WSEndpointImpl $ 2.process(WSEnd pointImpl.java:420) at com.sun.xml.ws.transport.http.HttpAdapter $ HttpToolkit.handle(HttpAdapter.java:687) at com.sun.xml.ws.transport.http.HttpAdapter.handle( HttpAdapter.java:266) at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:169) at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:169) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet。的java:790) 在org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 在org.apache。 catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline。 java:673) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) at org.apache。 catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357) at org.apache.catalina.connector.CoyoteAdapter.servi ce(CoyoteAdapter.java:260) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler。的java:191) 在org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 在org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 在org.glassfish.grizzly.filterchain.ExecutorResolver $ 9.execute(ExecutorResolver.java:119) 在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 在org.glassfish.grizzly.filterchain.DefaultFilterChain .executeChainPart(DefaultFilterChain.java:206) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFil (org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish。 grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0( WorkerThreadIOStrategy.java:115) 在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:55) 在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 在org.glassfish.grizzly.threadpool.Abstr (java.lang.Thread.run)(Thread.java:745)$ act.ThreadPool $ Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:544) ]]

我的代码:

public Connection getPoolConexaoCallbackDataSource() throws Exception { 

     InitialContext context = new InitialContext(); 
     DataSource ds = (DataSource) context.lookup("jdbc/CallbackNaFilaDb"); 

     try { 

      return ds.getConnection(); 
     } catch (SQLException e) { 
      GeraLog.logInfo("Erro ao obter conexão com o banco de dados CallbackNaFilaDb " + e.getMessage()); 
      e.printStackTrace(); 
      return null; 
     } 
    } 

@WebMethod(operationName = "consultarParametros") 
    public String consultarParametros(@WebParam(name = "CONNID") String connId, @WebParam(name = "SERVICO") String servico, @WebParam(name = "EWTCHAMADA") String ewtChamada, @WebParam(name = "TAMFILACHAMADA") String tamFilaChamada, @WebParam(name = "NIVELSERVICOCHAMADA") String nivelServicoChamada){ 
     String ativaCallback; 
     List<CondicoesGatilho> listCg = new ArrayList<>(); 
     int servicoId = 0; 
     char faixaHorarioLiberado; 
     String faixaDeHorarioConfigurada; 
     String tratamentoRetorno; 
     String condicoesGatilhoConfig; 
     String gatilho; 
     String resultado; 
     Connection conn = null; 
     ResultSet rsProgramacao = null; 
     ResultSet rsGatilhos = null; 
     long nivelServico = 0; 
     GeraLog.logInfo("[CONSULTAR_PARAMETROS] PARAMETROS PASSADOS PELA ESTRATEGIA: [CONNID] " + connId + " | [SERVICO] " + servico + " | [EWTCHAMADA] " + ewtChamada + " | [TAMFILACHAMADA] " + tamFilaChamada + " | [NIVELSERVICOCHAMADA] " + nivelServicoChamada); 



     String SQL_CONFIGURACAO = "SELECT SERVICO.*, PROGRAMACAO.*\n" + 
            "FROM SERVICO JOIN PROGRAMACAO\n" + 
            "ON PROGRAMACAO.SERVICO = SERVICO.ID\n" + 
            "WHERE SERVICO.NOME = '" + servico + "'\n" + 
            "AND DIA_SEMANA = TO_NUMBER(TO_CHAR(SYSDATE, 'D'))\n" + 
            "AND SYSDATE BETWEEN TO_DATE(CONCAT(CONCAT(TO_CHAR(SYSDATE, 'DD-MM-RRRR'), ' '), HORA_OFERTADA_INICIAL), 'DD-MM-RRRR HH24:MI:SS')\n" + 
            "    AND TO_DATE(CONCAT(CONCAT(TO_CHAR(SYSDATE, 'DD-MM-RRRR'), ' '), HORA_OFERTADA_FINAL), 'DD-MM-RRRR HH24:MI:SS')\n" + 
            "    AND DATA_EXCLUSAO IS NULL"; 

     try { 
      ConnectDb connDb = new ConnectDb(); 
      conn = connDb.getPoolConexaoCallbackDataSource(); 
      rsProgramacao = conn.createStatement().executeQuery(SQL_CONFIGURACAO); 

      if(rsProgramacao.next()){ 
       servicoId = rsProgramacao.getInt("ID"); 
       resultado = "OK"; 
       ativaCallback = rsProgramacao.getString("ATIVA_CALLBACK").equalsIgnoreCase("S") ? "1" : "0"; 
       faixaHorarioLiberado = 'S'; 
       faixaDeHorarioConfigurada = rsProgramacao.getString("HORA_OFERTADA_INICIAL") + "-" + rsProgramacao.getString("HORA_OFERTADA_FINAL"); 


       String SQL_GATILHO = "SELECT CG.CONDICAO, GS.VALOR\n" + 
            "FROM GATILHOSXSERVICO GS JOIN CONDICOES_GATILHO CG\n" + 
            "ON GS.CONDICOES_GATILHO = CG.ID\n" + 
            "WHERE GS.SERVICO = " + servicoId; 

       rsGatilhos = conn.createStatement().executeQuery(SQL_GATILHO); 

       while(rsGatilhos.next()){ 
        CondicoesGatilho cg = new CondicoesGatilho(); 
        cg.setCondicao((rsGatilhos.getString("CONDICAO"))); 
        cg.setValor(rsGatilhos.getInt("VALOR")); 

        if(cg.getCondicao().contains("EWT")){ 
         cg.setNomeParametro("EWTCHAMADA"); 
        }else if(cg.getCondicao().contains("TAMANHOFILA")){ 
         cg.setNomeParametro("TAMANHOFILA"); 
        }else if(cg.getCondicao().contains("NIVELSERVICO")){ 
         cg.setNomeParametro("NIVELSERVICO"); 
        } 

        listCg.add(cg); 


       } 
       try{ 
        nivelServico = Math.round(Double.valueOf(nivelServicoChamada)); 
       }catch(Exception e){ 
        nivelServico = 0; 
        GeraLog.logError("[CONSULTAR_PARAMETROS] EXCEPTION PARSE NIVELSERVICO"); 
       } 
       tratamentoRetorno = expressaoRegular(listCg, Integer.parseInt(ewtChamada), Integer.parseInt(tamFilaChamada), nivelServico); 
       GeraLog.logInfo("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | PARAMETROS RETORNADOS: " + tratamentoRetorno); 
       String[] str = tratamentoRetorno.split("="); 
       try{ 
        condicoesGatilhoConfig = str[0]; 
       }catch(ArrayIndexOutOfBoundsException ex){ 
        condicoesGatilhoConfig = ""; 
       } 
       Evaluator eval = new Evaluator(); 
       try{ 
        if (eval.getBooleanResult(str[1])){ 
         GeraLog.logInfo("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | SERVICO: " + servicoId + "-" + servico + " | FORMULA: " + str[1]); 
         gatilho = "1"; 
        }else{ 
         GeraLog.logInfo("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | SERVICO: " + servicoId + "-" + servico + " | FORMULA: " + str[1]); 
         gatilho = "0"; 
        } 
       }catch(Exception ex){ 
        GeraLog.logInfo("[CONSULTAR_PARAMETROS] EXCEPTION EVALUATOR - CHAMADA: " + connId + " | SERVICO: " + servicoId + "-" + servico + " | EXCEPTION FORMULA: " + ex.getMessage()); 
        gatilho = "0"; 
       } 
      } else { 
       resultado = "OK"; 
       ativaCallback = "0"; 
       faixaHorarioLiberado = 'N'; 
       faixaDeHorarioConfigurada = ""; 
       condicoesGatilhoConfig = ""; 
       gatilho = "0"; 
      } 
      GeraLog.logInfo("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | SERVICO: " + servicoId + "-" + servico + " | ATIVA_CALLBACK: " + ativaCallback + " | FAIXA_HORARIO_LIBERADO: " + faixaHorarioLiberado + " | FAIXA_HORARIO_CONFIGURADA: " + faixaDeHorarioConfigurada); 
      return "<RESULTADO>" + resultado + "</RESULTADO><ESTADO>" + ativaCallback + "</ESTADO><FAIXA_HORARIO_LIBERADO>" + faixaHorarioLiberado + "</FAIXA_HORARIO_LIBERADO><FAIXA_HORARIO_CONFIGURADA>" + faixaDeHorarioConfigurada + "</FAIXA_HORARIO_CONFIGURADA><CONDICOES_GATILHO_CONFIG>" + condicoesGatilhoConfig + "</CONDICOES_GATILHO_CONFIG><GATILHO>" + gatilho + "</GATILHO>"; 


     } catch (Exception ex) { 
      resultado = "NOK"; 
      ativaCallback = "0"; 
      faixaHorarioLiberado = 'N'; 
      faixaDeHorarioConfigurada = ""; 
      condicoesGatilhoConfig = ""; 
      gatilho = "0"; 
      GeraLog.logInfo("[CONSULTAR_PARAMETROS] EXCEPTION - CHAMADA: " + connId + " | SERVICO: " + servicoId + "-" + servico + " | ATIVA_CALLBACK: " + ativaCallback + " | FAIXA_HORARIO_LIBERADO: " + faixaHorarioLiberado + " | FAIXA_HORARIO_CONFIGURADA: " + faixaDeHorarioConfigurada + " | ERRO: " + ex.getMessage()); 
      ex.printStackTrace(); 
      return "<RESULTADO>" + resultado + "</RESULTADO><ESTADO>" + ativaCallback + "</ESTADO><FAIXA_HORARIO_LIBERADO>" + faixaHorarioLiberado + "</FAIXA_HORARIO_LIBERADO><FAIXA_HORARIO_CONFIGURADA>" + faixaDeHorarioConfigurada + "</FAIXA_HORARIO_CONFIGURADA><CONDICOES_GATILHO_CONFIG>" + condicoesGatilhoConfig + "</CONDICOES_GATILHO_CONFIG><GATILHO>" + gatilho + "</GATILHO>"; 
     } finally { 
      try { 
       if (rsGatilhos != null) { 
        rsGatilhos.getStatement().close(); 
        rsGatilhos.close(); 
        rsGatilhos = null; 
       } 
      } catch (Exception ex) { 
       GeraLog.logError("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | ERRO AO FECHAR O rsGatilhos " + ex.getMessage()); 
       ex.printStackTrace(); 
      } 



      try { 
       if (rsProgramacao != null) { 
        rsProgramacao.getStatement().close(); 
        rsProgramacao.close(); 
        rsProgramacao = null; 
       } 
      } catch (Exception ex) { 
       GeraLog.logError("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | ERRO AO FECHAR O rsProgramacao " + ex.getMessage()); 
       ex.printStackTrace(); 
      } 


      try { 
       if (conn != null) { 
        conn.close(); 
        conn = null; 
       } 
      } catch (Exception ex) { 
       GeraLog.logError("[CONSULTAR_PARAMETROS] CHAMADA: " + connId + " | ERRO AO FECHAR O CONN " + ex.getMessage()); 
       ex.printStackTrace(); 
      } 
     } 


    } 

配置池:

Initial and Minimum Pool Size: 8 Connections 
Maximum Pool Size: 32 Connections 
Pool Resize Quantity: 2 Connections 
Idle Timeout: 300 Seconds 
Max Wait Time: 60000 Milliseconds 

连接字符串 - 数据库的Oracle 10g:

JDBC:预言:瘦:@(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521)) (ADDRESS =(PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))(LOAD_BALANCE = YES)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl10))

My connection pool statistics.

+0

听起来像是数据库监听器或网络中的某个东西正在丢弃连接,可能是在定义的空闲时间段或连接的总长度之后,或者如果找不到模式,可能只是来自通信故障。 –

回答

0

我猜你的代码库的某处有它得到一个连接,但不close()它在finally块的方法。您发布的代码在这方面似乎表现正确。您需要搜索代码的其余部分以查找违规方法。

这样手动写入JDBC意味着可能会泄漏连接。你有没有考虑过使用像JdbcTemplate.execute(callback)这样的模式?

我最近用几行代码实现了我自己的JdbcTemplate,因为我想在不需要弹簧依赖的情况下使用该模式。你也可以做同样的事情。

0

可能是您的连接被强制关闭。

尝试在执行前通过conn.isClosed()检查连接状态,并在未执行时重新打开。

+0

嗨,谢谢你的回复!我如何请求打开逻辑连接? conn.open()? – Renan

+0

连接对象关闭后,必须先释放它并创建一个新对象,方法与第一次相同: conn = connDb.getPoolConexaoCallbackDataSource(); –