Página 1 de 1

Como manter a conexão MySql?

Enviado: 17 Fev 2012 01:44
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

Como manter a conexão MySql?

Enviado: 17 Fev 2012 15:42
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.

Como manter a conexão MySql?

Enviado: 17 Fev 2012 17:06
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.

Como manter a conexão MySql?

Enviado: 17 Fev 2012 17:45
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;

Como manter a conexão MySql?

Enviado: 17 Fev 2012 18:05
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

Como manter a conexão MySql?

Enviado: 17 Fev 2012 18:25
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.

Como manter a conexão MySql?

Enviado: 17 Fev 2012 20:16
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.

Como manter a conexão MySql?

Enviado: 21 Fev 2012 03:07
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()

Como manter a conexão MySql?

Enviado: 21 Fev 2012 22:24
por pauloa1
Olá Leonardo!

tem como postar um exemplo disso?

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

Paulo

Como manter a conexão MySql?

Enviado: 23 Fev 2012 12:55
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)