Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #87698
    facc
    Participante

      Estou tendo um problema com essa Inactive Session

      Vou tentar explicar mais ou menos o que acontece.
      Tem um sistema de loja que realiza reservas de alguns numeros através de uma página ASP (as lojas não tem acesso direto ao banco)
      Mas notei que algumas vezes as sessões ficam inativas ocasionando demora para a realização dessas reservas, imagine 69 lojas ligando reclamando dessa demora. Isso ocorreu das 15:14 até as 15:45 de hoje (02/07/2009) e voltou sem mais nem menos, agora ele fica nesse ping-pong

      Agora como eu resolvo isso?

      #87700
      David Siqueira
      Participante

        Opa!..vou tentar te ajudar, cara.
        VOcê usa algum drive especifico pra se conectar ao Banco? Uma vez que as conexões não são feitas de maneira direta via client Oracle.

        Você por um acaso saberia dizer se essas sesões ao entrarem no seu Banco ficam inativas ou se pelo menos apresentam algum traço de execução?

        Há eventos de Waits ligados a essas sessões?

        Abraços.

        #87701
        facc
        Participante

          Então é uma chamada via Página ASP (Não é aberta para a internet) não sei ao certo como é feita essa conexão, pois é uma empresa terceirizada que chama as minhas procedures.
          Sim tenho um Lock Table nessa procedure, mas pelo que eu sei, vc comitando a tabela é liberada. Essa procedure já vem sendo executada desde 19/06/2009.

          segue a procedure
          CREATE OR REPLACE PROCEDURE CYBELAR_RES_NRSORTE(P_LOJA IN varchar2,
          P_PDV IN VARCHAR2,
          P_QTD IN NUMBER,
          P_NROSORTE OUT varchar2,
          P_CONFIRMA OUT NUMBER) is
          /***********************************************************
          * PROCEDURE : CYBELAR_RES_NRSORTE *
          * OBJETIVO : RESERVAR O NRSORTE P/ A LOJA E "ESCONDER" *
          DAS DEMAIS LOJAS E OUTRAS RESERVAS *
          * CRIACAO : 19/06/2009 *
          * VERSAO : 1.5 *
          * AUTOR : FABIO A. CAMPOS CRUZ - *
          ***********************************************************/
          look_error exception;

          pragma exception_init(look_error, -54);

          retorno_nrsorte varchar2(5);
          ListaNrsorte varchar2(1000);
          RETORNOCONFIRMA NUMBER;
          erro_int varchar2(1000);
          vc_dir_log varchar2(100);
          vc_id_log varchar2(7) := 'CYBELAR';
          vc_arq_log varchar2(60) := 'NRSORTE_' || to_char(sysdate, 'DDMMYY') ||
          '.LOG';
          vc_nome_pgm varchar2(50) := 'PDV_NRSORTE';
          vu_file utl_file.file_type;

          VN_QTREG NUMBER := 0;

          begin
          BEGIN
          SELECT PINT_NM_DIRETORIO_LOG
          INTO VC_DIR_LOG
          FROM GEMCO_PARAMETRO_INTERFACE PINT, GEMCO_SISTEMA SIST
          WHERE PINT.PINT_CD_SISTEMA = SIST.SIST_CD_SISTEMA
          AND SIST.SIST_DS_SISTEMA = vc_nome_pgm;
          EXCEPTION
          -- SE NAO EXISTIR INFORMAR O DIRETORIO ONDE DEVERA SER
          -- GERADO O LOG DE OCORRENCIAS
          WHEN NO_DATA_FOUND THEN
          VC_DIR_LOG := '/integra/Log';
          WHEN TOO_MANY_ROWS THEN
          VC_DIR_LOG := '/integra/Log';
          WHEN OTHERS THEN
          VC_DIR_LOG := '/integra/Log';
          END;

          begin
          vu_file := utl_file.fopen(vc_dir_log, vc_arq_log, 'r');
          utl_file.fclose(vu_file);
          exception
          when others then
          sp_int_gemco_gera_log('INICIO DO LOG',
          vc_dir_log,
          vc_id_log,
          vc_arq_log,
          sysdate,
          null,
          vc_nome_pgm,
          0,
          0,
          0);
          end;

          FOR rNrSorte IN 1 .. P_QTD loop
          BEGIN
          LOCK TABLE CYBELAR_NROSORTE IN EXCLUSIVE MODE;

            SELECT NRO.NROSORTE
              INTO retorno_nrsorte
              FROM CYBELAR_NROSORTE NRO
             WHERE LOJA IS NULL
               AND FLGUSO = 0
               AND TO_CHAR(MES_ANO, 'YYYYMM') = TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'YYYYMM')
               AND ROWNUM <= 1         
               FOR UPDATE NOWAIT;
          
            ListaNrsorte := retorno_nrsorte || '|' || ListaNrsorte;
          
            UPDATE CYBELAR_NROSORTE
               SET FLGUSO      = 1,
                   LOJA        = P_LOJA,
                   PDV_CAIXA   = P_PDV,
                   DATANRSORTE = SYSDATE
             WHERE NROSORTE = retorno_nrsorte
               AND TO_CHAR(MES_ANO, 'YYYYMM') = TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'YYYYMM');
            COMMIT;
          EXCEPTION
            WHEN look_error THEN
              NULL;
          END;
          
          RETORNOCONFIRMA := 0;
          VN_QTREG := VN_QTREG + 1;
          

          end loop;
          COMMIT;

          IF VN_QTREG = 0 THEN
          ERRO_INT := 'ERRO AO RESERVAR O NRSORTE (' || P_NROSORTE ||
          ') PARA A LOJA ' || P_LOJA || '.';
          RETORNOCONFIRMA := 1;
          ELSE
          ERRO_INT := 'RESERVADO COM SUCESSO (' || ListaNrsorte ||
          '). LOJA ' || P_LOJA;
          RETORNOCONFIRMA := 0;
          END IF;

          sp_int_gemco_gera_log('GERA LOG',
          vc_dir_log,
          vc_id_log,
          vc_arq_log,
          sysdate,
          erro_int,
          vc_nome_pgm,
          0,
          0,
          0);

          sp_int_gemco_gera_log('FIM LOG',
          vc_dir_log,
          vc_id_log,
          vc_arq_log,
          sysdate,
          null,
          vc_nome_pgm,
          0,
          0,
          0);
          COMMIT;

          P_CONFIRMA := RETORNOCONFIRMA;
          P_NROSORTE := ListaNrsorte;

          end cybelar_res_nrsorte;

          #87703
          vieri
          Participante

            Pra que utilizar o lock table in exclusive mode, se ele utiliza o select for update ?

            O select for update já garante isso…

            isso pra mim é overhead de gerência de bloqueio.

            #87705
            facc
            Participante

              [quote=”vieri”:1b3ml10g]Pra que utilizar o lock table in exclusive mode, se ele utiliza o select for update ?

              O select for update já garante isso…

              isso pra mim é overhead de gerência de bloqueio.[/quote]

              Pq eu estava utilizando apenas o select for update e mesmo assim estava me retornando registros duplicados

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.