Como manter a conexão MySql?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como manter a conexão MySql?

Mensagem por JoséQuintas »

Devido a pausas no sistema, ou até mesmo o usuário fazer uma grande pausa, a conexão MySql é perdida.
Como posso evitar que ela seja fechada?
Por enquanto usei uma função pra fechar/abrir caso o último acesso tenha mais de um minuto.
Mas teria que colocar em todas as partes do sistema, e mesmo assim poderia ser fechada em momento errado.

Function TestcnMySql(cnMySql)
Static cTime := ""

If Len(cTime) == 0
cTime := Time()
Endif

If Substr(cTime,1,5) != Substr(Time(),1,5)
cnMySql:Close()
cnMySql:Open()
Endif
Return NIL

Como vocês resolvem este tipo de coisa?

Obs. Antes eu usava pra abrir/fechar o tempo todo, conforme o uso, mas aí o Windows estoura o limite, porque conexões mortas tem um tempo pra desaparecer, e o limite do Windows é de apenas 10.
Estou usando ADO, através de WinOleCreateObject("ADODB.Connection")

José M. C. Quintas
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como manter a conexão MySql?

Mensagem por alxsts »

Olá!

Pelo que conheço em termos de "Boas Práticas", o ideal é não manter conexões de banco de dados abertas desnecessariamente. Isso economiza recursos de sistema e em muitos casos é usado por não haver um número de licenças de acesso simultâneo que comporte toda a demanda por conexões.

Funciona assim: abre a conexão quando precisa usar, usa e fecha.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como manter a conexão MySql?

Mensagem por JoséQuintas »

Como eu disse antes, usando desse jeito acabo tendo erros.
Open(),Close().... o Windows mantém essa conexão como half-open por algum tempo antes de excluir de vez.
O limite do Windows é de somente 10 conexões em modo half-open.

Eu sempre usei desse jeito (abrindo/fechando), mas comecei a aumentar o uso do MySql, e o limite do Windows acaba rápido.
Conferi, e as conexões ficam fechadas, em estado de espera para o Windows eliminá-las.

Já usando uma única conexão, acontece o oposto, ela é fechada quando fica sem uso por muito tempo. (10 ou 15 minutos).

É até curioso.... consultando a lista do windows: (netstat -a | find "3306")
abrindo e fechando, aparecem várias conexões em modo de espera pra fechar
sempre aberta, aparece uma única conexão

No final, não sei qual consome mais recursos, mas sei que abrir/fechar deixou de ser opção viável.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como manter a conexão MySql?

Mensagem por alxsts »

Olá!

Como você está conectando? Tem um modelo de connection string que permite ativar ou não o pooling:

Código: Selecionar todos

User ID=root;Password=myPassword;Host=localhost;Port=3306;Database=myDataBase; Direct=true;Protocol=TCP;Compress=false;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como manter a conexão MySql?

Mensagem por JoséQuintas »

nunca tinha visto esses parâmetros:
Direct=true
Protocol=TCP
Pooling=true
Min Pool Size=0
Max Pool Size=100
Connection LifeTime=0
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como manter a conexão MySql?

Mensagem por alxsts »

Olá!

Retirei do site ConnectionString . com. É ótimo para referência. Tem vários tipos de conexão para todos os bancos de dados. Pesquise lá. Talvez encontre algo que ajude mais.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como manter a conexão MySql?

Mensagem por JoséQuintas »

Dei uma olhada lá.
Essa string que passou é a que está em .NET Framework Class Library.
Só testando pra ver se vale fora do NET.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Como manter a conexão MySql?

Mensagem por sygecom »

Se a perda da conexão for falha de uma estrutura da rede ou algo assim isso pouco adiantará. Eu não sei até onde isso é certo ou não, mas eu tenho um SET TIMER que roda a cada 30 segundos que uso para verificar se algum administrador solicitou o fechamento de alguma estação e aproveito para ver se a conexão caiu ou não executando um: select version()
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
pauloa1
Usuário Nível 3
Usuário Nível 3
Mensagens: 227
Registrado em: 25 Jun 2008 14:57
Localização: Augusto Pestana-RS

Como manter a conexão MySql?

Mensagem por pauloa1 »

Olá Leonardo!

tem como postar um exemplo disso?

caso a conexão cair, dar a mensagem e tentar reconectar automaticamente.

Paulo
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Como manter a conexão MySql?

Mensagem por sygecom »

Olá,
Eu alterei meu errorsys.prg e acresentei o seguinte:

Código: Selecionar todos

   IF Revisa_conexao()=.F.
      IF REVISA_CONEXAO()=.F.
         DO WHILE .T.
            IF MY_MSGYESNO("Conexão com o Servidor Inativa, deseja tentar reconectar ?")
               IF ABRE_DADOS(.T.)=.T.
                  RETURN .T.
               ELSE
                  LOOP
               ENDIF
            ELSE
               EXIT
            ENDIF
         ENDDO
      ELSE
         IF ConectionOK()=.F.     // VEREFICA SE ESTA ATIVA A CONEXÃO
            DO WHILE .T.
               IF MY_MSGYESNO("Conexão com o Servidor Inativa, deseja tentar reconectar ?")
                  IF Abre_dados(.T.)=.T.
                     RETURN .T.
                  ELSE
                     LOOP
                  ENDIF
               ELSE
                  EXIT
               ENDIF
            ENDDO
         ENDIF
      ENDIF

Código: Selecionar todos

function ConectionOk
local lOK
local oCon
local cSql
local aret :={}

if eTIPO_SQL="FIREBIRD"
   cSQL := "SELECT MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION"
else
   cSql   := "select version()"
endif

oCon:= SR_GetConnection()    // Obtem o objeto da conexão ativa
oCon:Exec(cSql,.F.,.t.,@aRet)
lOK:= Len(aRet) == 0
return lOk

***********************
FUNCTION REVISA_CONEXAO
***********************
Local lRet:=.T.
HW_Atualiza_Dialogo("Revisando Conexão")
IF inetestaconectada( eHOST )=.T.
   HW_Atualiza_Dialogo("Conexão: OK")
ELSE
   lRet:=.F.
   ShowMsg("NÃO CONECTADO")
   HW_Atualiza_Dialogo("Conexão: Falhou")
ENDIF
Return(lRet)

Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder