Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

BlackTDN :: TSS, PostGreSQL e dbAccess Error -35

Davi Cunha, de Recife, enviou-nos a seguinte mensagem:

“…segue uma breve explicação do estado em que estamos com o erro do TSS. O servidor  está configurado e até enviando NF-e, porém, em determinado momento, o mesmo apresenta no modo console um erro (Erro -35) intermitente de comunicação com o Banco de Dados TSS. Percebi que isso começou a acontecer logo após a configuração dos certificados digitais de mais de uma empresa. Este erro faz com que o envio em determinadas notas, se prolongue mais que o esperado. Segue o link abaixo com um pequeno vídeo que salvei do momento inicial ao qual subo o serviço do TSS. …”

O Erro –35, segundo o TDN (Lista dos códigos de erros do TOTVS DBAccess), corresponde a:

-35

TCF_NoDBConnection

O database não pode ser acessado.

E esse erro nem sempre está relacionado ao Protheus, ao TSS ou ao dbAccess mas sim ao DBMS/SGBD. No Caso em questão ao PostGreSQL que não estava permitindo, ao dbAccess efetuar novas conexões.

Solicitamos que verificasse a “diretiva” max_connections no arquivo postgresql.conf (que no caso estava definida como 100) pois ali estava a,  provável, causa do Error –35. As conexões deveriam ter atingido o máximo permitido/configurado. Solicitamos que efetuasse o monitoramento das conexões ao PostGreSQL para identificar isso e, considerando que o DBMS estava instalado no Linux, recomendamos seguir as instruções do Link: Definindo a quantidade de conexões simultâneas no PostgreSQL e, consequentemente, aumentar o número máximo de conexões definidos em max_connections de acordo com a demanda.

Recomendamos a leitura de:

Para identificar as implicações na alteração da “diretiva” max_connections em relação às demais diretivas, como por exemplo: SHMMAX e shared_buffers.

Abaixo disponibilizamos um código em ADVPL para testar o limite de Conexões permitidas pelo DBMS/SGBD:

Interessado no original, clique aqui ou aqui.

Obs.: Atente-se às seguintes “Definições”:

#IFDEF __NALDO_PC
    #DEFINE TC_DBMS        "MSSQL/RNP"
    #DEFINE TC_PORT        7890
    #DEFINE TC_SERVER  "127.0.0.1"
#ELSE
    #DEFINE TC_DBMS        "POSTGRES/TSS"
    #DEFINE TC_PORT        7890
    #DEFINE TC_SERVER  "192.168.1.5"
#ENDIF

#DEFINE TC_MAXCONNECTION 10000

São a partir delas que os testes são efetuados. Altere-as conforme a necessidade.

Eis o código:

   1: #IFDEF __NALDO_PC
   2:     #DEFINE TC_DBMS        "MSSQL/RNP"
   3:     #DEFINE TC_PORT        7890
   4:     #DEFINE TC_SERVER      "127.0.0.1"
   5: #ELSE
   6:     #DEFINE TC_DBMS        "POSTGRES/TSS"
   7:     #DEFINE TC_PORT        7890
   8:     #DEFINE TC_SERVER      "192.168.1.5"
   9: #ENDIF
  10:  
  11: #DEFINE TC_MAXCONNECTION 10000
  12:  
  13: /*
  14:     Programa    :    TCError35()
  15:     Autor       :    Marinaldo de Jesus [http://www.blacktdn.com.br]
  16:     Data        :    15/06/2011
  17:     Uso         :    Testar Limite de Conexoes ao DBMS
  18: */
  19: User Function TCError35()  
  20:  
  21:     Local aTCConnection     := Array(0)
  22:  
  23:     Local bError            := { |e| oError := e , BREAK(e) }
  24:     Local bErrorBlock       := ErrorBlock( bError )
  25:     
  26:     Local cDescription
  27:  
  28:     Local nTCConnection     := 0
  29:     Local nMaxConnection    := 0
  30:  
  31:     Local oError
  32:  
  33:     BEGIN SEQUENCE
  34:  
  35:         While ( ++nMaxConnection <= TC_MAXCONNECTION )
  36:             IF ( KillApp() )
  37:                 UserException( "[PROCNAME]["+ProcName()+"][MESSAGE RECEIVED][KILAPP]")
  38:             EndIF
  39:             nTCConnection    := TCLink( TC_DBMS , TC_SERVER , TC_PORT )
  40:             IF ( nTCConnection == -34 ) //TCF_TooManyUsers
  41:                 ConOut( "" )
  42:                 ConOut( "===============================================================" )
  43:                 ConOut( "" , "[TCLINK][TCF_TooManyUsers]["+LTrim(Str(nTCConnection))+"][RECONNECTING...]" , "" )
  44:                 ConOut( "===============================================================" )
  45:                 ConOut( "" )
  46:                 nTCConnection    := TCLink( "@!!@" + TC_DBMS , TC_SERVER , TC_PORT )
  47:             EndIF
  48:             IF ( nTCConnection == -35 ) //TCF_NoDBConnection
  49:                 UserException( "-35 TCF_NoDBConnection" )
  50:             EndIF
  51:             IF ( nTCConnection >= 0 )
  52:                 aAdd( aTCConnection , nTCConnection )
  53:                 ConOut( "" )
  54:                 ConOut( "===============================================================" )
  55:                 ConOut( "" , "[TCLINK]["+LTrim(Str(nTCConnection))+"]" , "" )
  56:                 ConOut( "===============================================================" )
  57:                 ConOut( "" )
  58:             EndIF
  59:         End While
  60:  
  61:         nTCConnection    := Len( aTCConnection )
  62:  
  63:         ConOut( "" )
  64:         ConOut( "===============================================================" )
  65:         ConOut( " [TC_MAXCONNECTION]["+LTrim(Str(TC_MAXCONNECTION))+"]" )
  66:         ConOut( " [TENTATIVAS DE CONEXAO]["+LTrim(Str(nMaxConnection))+"]" )
  67:         ConOut( " [CONEXOES ATIVAS]["+LTrim(Str(nTCConnection))+"]" )
  68:         ConOut( "===============================================================" )
  69:         ConOut( "" )
  70:  
  71:         aEval( aTCConnection , { |nTCLink| TCUnLink( nTCLink ) } )
  72:         aSize( aTCConnection , 0 )
  73:  
  74:     RECOVER
  75:  
  76:         IF ( ValType( oError ) == "O" )
  77:  
  78:             cDescription     := oError:Description
  79:             nTCConnection    := Len( aTCConnection )
  80:  
  81:             ConOut( "" )
  82:             ConOut( "===============================================================" )
  83:             IF ( "-35" $ cDescription )
  84:                 ConOut( " [ATENCAO][Excedeu o Numero de Conexoes ao DBMS]" )
  85:             EndIF
  86:             ConOut( " [TCWARNING]["+cDescription+"]" )
  87:             ConOut( " [TC_MAXCONNECTION]["+LTrim(Str(TC_MAXCONNECTION))+"]" )
  88:             ConOut( " [TENTATIVAS DE CONEXAO]["+LTrim(Str(nMaxConnection))+"]" )
  89:             ConOut( " [CONEXOES ATIVAS]["+LTrim(Str(nTCConnection))+"]" )
  90:             ConOut( "===============================================================" )
  91:             ConOut( "" )
  92:  
  93:         EndIF
  94:  
  95:         aEval( aTCConnection , { |nTCLink| TCUnLink( nTCLink ) } )
  96:         aSize( aTCConnection , 0 )
  97:  
  98:     END SEQUENCE
  99:     ErrorBlock( bErrorBlock )
 100:  
 101: Return( NIL )

É correto afirmar que o número de conexões apresentadas por esse exemplo corresponderão, única e tão somente, aos testes efetuados por ele. As conexões reais deverão ser obtidas via dbMonitor ou via gerenciador do DBMS/SGBD. O exemplo foi desenvolvido pressupondo a execução em modo “console” (Protheus) e de exclusividade (DBMS/SGBD).


TOTVS :: dbMonitor : Usuários Conectados


[]s
иαldσ dj

Comentários

  1. Naldo, você poderia me ajudar? Estou precisando colocar algumas url's no TSS para trabalhar com determinado webservice de uma prefeitura de cidade pequena que não é homologado pela Totvs. Você sabe onde configuro estes endereços?

    Att,

    Henrique

    ResponderExcluir

Postar um comentário

Postagens mais visitadas