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_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: EndIF48: IF ( nTCConnection == -35 ) //TCF_NoDBConnection
49: UserException( "-35 TCF_NoDBConnection" ) 50: EndIF51: IF ( nTCConnection >= 0 )
52: aAdd( aTCConnection , nTCConnection ) 53: ConOut( "" ) 54: ConOut( "===============================================================" ) 55: ConOut( "" , "[TCLINK]["+LTrim(Str(nTCConnection))+"]" , "" ) 56: ConOut( "===============================================================" ) 57: ConOut( "" ) 58: EndIF59: 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).
[]s
иαldσ dj
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?
ResponderExcluirAtt,
Henrique