java.sql.SQLException:已关闭连接

时间:2016-02-22 16:45:43

标签: java oracle jdbc

我有一个在应用服务器上运行的web服务GlassFish Server开源版4.0(版本89)/ JDK 1.7.0_79 /驱动程序ojdbc14.jar / S.O:Windows Server 2008 R2 Standard。问题是,我在同一个应用程序服务器中配置了JDBC连接池,然后我收到以下错误(这个错误在白天间歇性地发生):

  

java.sql.SQLException:已关闭连接       at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)       at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)       at 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.base.ConnectionHolder.createStatement(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)       在org.glassfish.webservices.InstanceResolverImpl $ 1.invoke(InstanceResolverImpl.java:143)       at com.sun.xml.ws.server.InvokerTube $ 2.invoke(InvokerTube.java:149)       在com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:88)       在com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136)       在com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)       在com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019)       在com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877)       at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:136)       在org.glassfish.webservices.MonitoringPipe.process(MonitoringPipe.java:142)       在com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119)       在com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136)       在com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)       在com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019)       在com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877)       at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:136)       在com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:210)       在com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:142)       在com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119)       在com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136)       在com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)       在com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019)       在com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877)       at com.sun.xml.ws.server.WSEndpointImpl $ 2.process(WSEndpointImpl.java:420)       at com.sun.xml.ws.transport.http.HttpAdapter $ HttpToolkit.handle(HttpAdapter.java:687)       在com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:266)       at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:169)       在org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:169)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:707)       在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)       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)       在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)       在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)       在com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)       在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)       在org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)       在com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)       在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)       在org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)       在org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)       在org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)       在org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)       在org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)       在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.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:564)       在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:544)       在java.lang.Thread.run(Thread.java:745)]]

我的代码:

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:oracle:thin:@(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.

2 个答案:

答案 0 :(得分:0)

我猜你的代码库中的某个地方有一个获取连接的方法,但在String块中没有close()它。您发布的代码似乎在这方面表现正常。您需要在代码的其余部分中搜索有问题的方法。

像这样手工编写JDBC意味着可能泄漏连接。您是否考虑使用JdbcTemplate.execute(callback)等模式?

我最近在几行代码中实现了自己的JdbcTemplate因为我想使用模式而不需要Spring依赖。你也可以这样做。

答案 1 :(得分:0)

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

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