1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Duvida Timeout no Totvs Datasul

Discussão em 'Progress 4GL' iniciado por ds201, Julho 10, 2021.

  1. ds201

    ds201 Membro Participativo

    Boa noite

    Estou trabalhando para um cliente que usa timeout com um tempo bem curto. Como meu programa demora para concluir a execução, é comum que ele seja derrubado pelo timeout.
    Será que se eu usar "utp/ut-acomp.p" o EMS entende que estou interagindo e não termina meu programa?
    Nota: O programa em questão é um "baca".

    Alguma ideia ?

    Obrigado
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Salve DS, eu fiz o seguinte, eu criei um ut-acomp pra mim, por baixo dos panos estou usando o ut-acomp do datasul, mas ele executa o meu que chama o original, dai quando vc faz o comandinho do acompanhamento, ou seja, quando vc faz o run para a procedure que mostra a mensagem de acompanhamento, eu coloco um find first numa tabela que ninguem usa, tipo a de cadastro de programas, de sistema, a que vc achar melhor, isso diz para o banco e para o time-out que vc está acessando o banco de dados e por sua vez ele não te derruba, agora vem a pergunta, o seu BACA está só calculando alguma coisa ou está fazendo I-O no banco ? Eu tive esse problema num especifico que lia a base de dados, até ai de boa, salvava os dados em temp-tables e depois descarraga pra um excel, essa parte do excel ficou demorada e dai o time-out me derrubava.
  3. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    As boas práticas em primeiro lugar é fazer uma boa verificação no seu código para melhorar a performance, seja usando novos índices ou mudando um pouco da lógica de como é feita.
    Sempre é possível melhorar a performance, já tive vários sistemas que tinham muita lentidão só por usar consulta não explícita, vou exemplificar:

    Como era:
    Código:
    FIND FIRST minhaTabela WHERE minhaTabela.it-codigo = "AABBCC" AND NOT minhaTabela.deletado NO-LOCK NO-ERROR.
    
    Como ficou:
    Código:
    FIND FIRST minhaTabela WHERE minhaTabela.it-codigo = "AABBCC" AND minhaTabela.deletado = FALSE NO-LOCK NO-ERROR.
    
    Só isso já reduziu o tempo em mais de 10x, pois do jeito que estava fazia o banco se perder no índice, e a tabela era gigante, demorava demais.

    O ideal seria você colocar mensagem em vários pontos do programa, pra ver em qual bloco está causando mais lentidão pra melhorar.

    Depois verificar se tem índice.

    Verificar se não é possível fazer a mesma função mas usando uma outra lógica.

    Depois disso, aí sim você poderia fazer uma outra solução.
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Outro também que causa lentidão:

    Como era:
    Código:
    FIND FIRST minhaTabela WHERE minhaTabela.it-codigo = "AABBCC" AND minhaTabela.ativo NO-LOCK NO-ERROR.
    
    Como ficou (explícito):
    Código:
    FIND FIRST minhaTabela WHERE minhaTabela.it-codigo = "AABBCC" AND minhaTabela.ativo = TRUE NO-LOCK NO-ERROR.
    
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    usar um can-find antes do for each também ajuda muito, porque se a chave que vc está procurando não existe no banco, ele demora um monte tentando achar.
  6. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Humm, bom saber, dessa não sabia.

Compartilhe esta Página