BlackTDN Search

sexta-feira, 15 de junho de 2012

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

Um comentário:

  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