【问题标题】:java.sql.SQLException: Closed Connectionjava.sql.SQLException:关闭连接
【发布时间】:2016-06-04 04:52:51
【问题描述】:

我在应用服务器 GlassFish Server Open Source Edition 4.0 (build 89) / JDK 1.7.0_79 / Driver ojdbc14.jar / S.O:Windows Server 2008 R2 Standard 上运行了一个 Web 服务。问题是这样的,我在同一个应用服务器中配置了一个JDBC连接池,然后我得到以下错误(这个错误在白天间歇性发生):

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) 在 oracle.jdbc.driver.OracleConnection.privateCreateStatement(OracleConnection.java:845) 在 oracle.jdbc.driver.OracleConnection.createStatement(OracleConnection.java:799) 在 com.sun.gjc.spi.base.ConnectionHolder.createStatement(ConnectionHolder.java:256) 在 com.sun.gjc.spi.jdbc40.ConnectionWrapper40.createStatement(ConnectionWrapper40.java:75) 在 br.com.todo.ws.CallbackNaFilaService.consultarParametros(CallbackNaFilaService.java:654) 在 sun.reflect.GeneratedMethodAccessor113.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.glassfish.webservices.InstanceResolverImpl$1.invoke(InstanceResolverImpl.java:143) 在 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) 在 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) 在 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) 在 com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:420) 在 com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:687) 在 com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:266) 在 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) 在 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.

【问题讨论】:

  • 听起来像是数据库侦听器或网络中的某些东西正在断开连接,可能是在定义的空闲期或连接总长度之后,或者可能只是由于找不到通信故障一种模式。

标签: java oracle jdbc


【解决方案1】:

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

尝试在执行前通过 conn.isClosed() 检查连接状态,如果没有则重新打开。

【讨论】:

  • 您好,感谢您的回复!如何请求打开逻辑连接? conn.open()?
  • 一旦连接对象关闭,你必须释放它并创建一个新的,就像你第一次做的一样:conn = connDb.getPoolConexaoCallbackDataSource();
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 2014-09-19
    • 2016-07-01
    • 2017-07-18
    • 2011-08-02
    • 2012-10-26
    • 2019-01-23
    相关资源
    最近更新 更多