MYSQL CONNECTIONS SLEEP

KURTGU 04/03/2017 15:00:06
#472122
Alguém tem alguma solução para Matar todas as conexões que ficam em modo Sleep, aqui ja tinha aberto um tópico sobre este mesmo assunto, mas não consegui chegar em uma solução. Achei vários post na web dizendo para diminuir o tempo no arquivo .cfg mais como o servidor e externo, não tenho acesso gostaria de efetuar a conexão e ao fechar matar o processo e não deixar ela e modo sleep no pool de conexões até mesmo por que ao atingir 100 conexões sleep o sistema da erro.

ABRIR A CONEXÃO
EXECUTO O QUE PRECISO
FECHO A CONEXAO--------------------------AO FECHAR ELE DEIXA A CONEXÃO EM MODO SLEEP...NO POOL DE CONEXOES..
NILSONTRES 04/03/2017 15:13:20
#472123
Citação:

AO FECHAR ELE DEIXA A CONEXÃO EM MODO SLEEP...NO POOL DE CONEXOES


Estranho, esta dando dispose ao fechar ?

KURTGU 04/03/2017 15:14:27
#472124
Citação:

:
AO FECHAR ELE DEIXA A CONEXÃO EM MODO SLEEP...NO POOL DE CONEXOES
Estranho, esta dando dispose ao fechar ?



Sim close, dispose já tinha tentado isso a alguns anos atrás... O problema está que toda vez que abro a conexão e fecho fica 1 em modo sleep, na verdade ele deveria usar a mesma que esta e modo sleep, mais isso não acontece...




PROFESSOR 04/03/2017 16:17:44
#472126
Não é só o MySQL que possui esse inconveniente. Outros mecanismos mantém o pool após o client solicitar o encerramento da conexão. O objeto MySqlConnection possui um método compartilhado que será útil para o seu caso. Trata-se do ClearAllPools. Após fechar a conexão e destruir a instância, chame esse método e veja se resolve, ok?

Seria algo como:
...
conn.Close();
conn,Dispose();
MySqlConnection.ClearAllPools();
...

KURTGU 04/03/2017 16:31:53
#472128
Citação:

:
Não é só o MySQL que possui esse inconveniente. Outros mecanismos mantém o pool após o client solicitar o encerramento da conexão. O objeto MySqlConnection possui um método compartilhado que será útil para o seu caso. Trata-se do ClearAllPools. Após fechar a conexão e destruir a instância, chame esse método e veja se resolve, ok?

Seria algo como:

...
conn.Close();
conn,Dispose();
MySqlConnection.ClearAllPools();
...



Já tinha tentado desta forma... e tambem tentei pela string de conexão.

Agrupamento de Conexões
A partir da versão 6.2, as conexões inativas são removidas do pool, liberando recursos no cliente (sockets) e no servidor (sockets e threads). Não mantenha manualmente conexões (globais) e abra fechar. Mantenha a criação e eliminação de objetos de conexão o mais apertada possível, isso pode ser contra-intuitivo, mas os mecanismos de pooling vão cuidar bem do cache e seu código ficará mais limpo.

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Pooling=True;
Este é o comportamento padrão.
MySQL
Tamanho do pool de conexão
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
MinimumPoolSize=10;maximumpoolsize=50;
Os valores padrão são 0 e 100.
MySQL
Desativar pool de conexão
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Pooling=False;
MySQL
Estado de conexão resetado quando obtido do pool
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
ConnectionReset=True;
Faz uma viagem de ida e volta adicional para o servidor ao obter uma conexão do pool e estado de conexão será redefinido.
MySQL
Reciclar conexões no pool
Isso é útil em cenários de balanceamento de carga quando os servidores disponíveis mudam, você não quer 100 conexões constantes no pool apontando para apenas um servidor.

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
ConnectionLifeTime=300;
Especificado em segundos, a quantidade de tempo após a criação do objeto de conexão a conexão será destruída. A destruição só acontecerá quando as conexões forem retornadas para o pool.
MySQL
Não atualizar as configurações do servidor nas conexões no pool
Uma conexão pode ser longa vivida no pool, no entanto, as configurações do servidor de conexões são atualizadas (SHOW VARIABLES comando) cada vez retornado para o pool. Isso torna o uso do cliente do objeto de conexão atualizado com as configurações corretas do servidor. No entanto, isso faz com que uma viagem de ida e volta e para otimizar o desempenho pooling esse comportamento pode ser desativado.

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
CacheServerProperties=True;
Esta opção está disponível a partir do conector / NET versão 6.3
DS2T 04/03/2017 17:34:09
#472140
Resposta escolhida
Resolvido então?

Pelo que sei, o Connector tem esse comportamento como padrão por questão de otimização, para reaproveitar conexões. Porque é muito custoso iniciar uma nova conexão...
Mas até onde sei, colocando um Timeout resolve o problema.

Abraços!
KURTGU 04/03/2017 17:37:51
#472141
Citação:

:
Resolvido então?

Pelo que sei, o Connector tem esse comportamento como padrão por questão de otimização, para reaproveitar conexões. Porque é muito custoso iniciar uma nova conexão...
Mas até onde sei, colocando um Timeout resolve o problema.

Abraços!



DS2T Ele continua criando as conexões e não reutilizando vamos supor se eu efetuar 10 login ele cria 10 conexoes em modo sleep, toda vez que faco um con.open ele cria uma em modo sleep. Mesmo usando os comandos acima...
DS2T 04/03/2017 17:50:05
#472144
Poderia mostrar o trecho de código desde que inicia a conexão até o fim?
Pode ser algum recurso, tipo DataReader, Command que tá ficando aberto...

Abraços!
KURTGU 04/03/2017 17:55:36
#472146
 Public myCON As MySql.Data.MySqlClient.MySqlConnection
Public myCMD As MySql.Data.MySqlClient.MySqlCommand
Public myDRR As MySql.Data.MySqlClient.MySqlDataReader

[ô][ô]Strings de Conexão MySQL
Public MySQLHost As String = [Ô]MEU SERVER[Ô]
Public MySQLUsuario As String = [Ô]MEU USUARIO[Ô]
Public MySQLSenha As String = [Ô]MINHA SENHA[Ô]
Public MySQLDataBase As String = [Ô]MEU BANCO[Ô]
Public MySQLPool As Boolean = False

#Region [Ô]CONECTAR E DESCONECTAR[Ô]

Public Sub Conectar() [ô]Conecta no MySQL
Try
myCON = New MySql.Data.MySqlClient.MySqlConnection([Ô]Server=[Ô] & MySQLHost _
& [Ô];Port=[Ô] & MySQLPorta _
& [Ô];User id=[Ô] & MySQLUsuario _
& [Ô];Password=[Ô] & MySQLSenha _
& [Ô];Database=[Ô] & MySQLDataBase _
& [Ô];Pooling=[Ô] & False)
myCON.Open()
Catch ex As Exception

End Try
End Sub

Public Sub Desconectar() [ô]Desconecta do MySQL
myCON.Close()
myCON.Dispose()
myCON.ClearAllPoolsAsync()
End Sub

#End Region

Dim DadosUsuario As New DadosUsuario
Dim DadosPaciente As New DadosPaciente
Dim DadosEncaminhamento As New Encaminhamentos
Dim Atualizacao As New Atualizacao

<WebMethod()> _
Public Function EfetuarLogin(ByVal usuario As String, ByVal senha As String) As DadosUsuario
Try
Conectar()
Dim query As String
query = ([Ô]Select * From tb_login Where usuario=[ô][Ô] & usuario & [Ô][ô] and senha=[ô][Ô] & senha & [Ô][ô][Ô])
myCMD = New MySqlCommand(query, myCON)
myDRR = myCMD.ExecuteReader()
If myDRR.HasRows = True Then
While myDRR.Read()
DadosUsuario.iduser = myDRR.Item([Ô]id[Ô])
DadosUsuario.nomeuser = myDRR.Item([Ô]nome[Ô])
DadosUsuario.unidadeuser = myDRR.Item([Ô]unidade[Ô])
DadosUsuario.unidadedestinouser = myDRR.Item([Ô]unidade_destino[Ô])
DadosUsuario.encontrouuser = True
BuscaDataServidor()
End While
ElseIf myDRR.HasRows = False Then
DadosUsuario.encontrouuser = False
End If
Finally
Desconectar()
End Try
Return DadosUsuario
End Function

DS2T 04/03/2017 18:47:21
#472148
Tente algo assim:


Public myCON As MySql.Data.MySqlClient.MySqlConnection
Public myCMD As MySql.Data.MySqlClient.MySqlCommand
Public myDRR As MySql.Data.MySqlClient.MySqlDataReader

[ô][ô]Strings de Conexão MySQL
Public MySQLHost As String = [Ô]MEU SERVER[Ô]
Public MySQLUsuario As String = [Ô]MEU USUARIO[Ô]
Public MySQLSenha As String = [Ô]MINHA SENHA[Ô]
Public MySQLDataBase As String = [Ô]MEU BANCO[Ô]

#Region [Ô]CONECTAR E DESCONECTAR[Ô]

Public Sub Conectar() [ô]Conecta no MySQL
Try
myCON = New MySql.Data.MySqlClient.MySqlConnection([Ô]Server=[Ô] & MySQLHost _
& [Ô];Port=[Ô] & MySQLPorta _
& [Ô];User id=[Ô] & MySQLUsuario _
& [Ô];Password=[Ô] & MySQLSenha _
& [Ô];Database=[Ô] & MySQLDataBase _
& [Ô];Pooling=False[Ô])
myCON.Open()
Catch ex As Exception

End Try
End Sub

Public Sub Desconectar() [ô]Desconecta do MySQL
myCON.Close()
myCON.Dispose()
myCON.ClearAllPoolsAsync()
End Sub

#End Region

Dim DadosUsuario As New DadosUsuario
Dim DadosPaciente As New DadosPaciente
Dim DadosEncaminhamento As New Encaminhamentos
Dim Atualizacao As New Atualizacao

<WebMethod()>
Public Function EfetuarLogin(ByVal usuario As String, ByVal senha As String) As DadosUsuario
Try
Conectar()
Dim query As String
query = ([Ô]Select * From tb_login Where usuario=[ô][Ô] & usuario & [Ô][ô] and senha=[ô][Ô] & senha & [Ô][ô][Ô])
myCMD = New MySqlCommand(query, myCON)
myDRR = myCMD.ExecuteReader()
If myDRR.HasRows = True Then
While myDRR.Read()
DadosUsuario.iduser = myDRR.Item([Ô]id[Ô])
DadosUsuario.nomeuser = myDRR.Item([Ô]nome[Ô])
DadosUsuario.unidadeuser = myDRR.Item([Ô]unidade[Ô])
DadosUsuario.unidadedestinouser = myDRR.Item([Ô]unidade_destino[Ô])
DadosUsuario.encontrouuser = True
BuscaDataServidor()
End While
ElseIf myDRR.HasRows = False Then
DadosUsuario.encontrouuser = False
End If

[ô][ô]fecha e libera os objetos da memória
myDRR.Close()
myDRR.Dispose()
myCMD.Dispose()

Finally
Desconectar()
End Try
Return DadosUsuario
End Function

Primeiro, modifiquei a variável booleana do Spool da string de conexão, deixei constante como string.
Segundo, fechei e liberei os recursos dos seus objetos Command e Reader...

Isso talvez ajude.

Tome cuidado também com o escopo das variáveis. Essas propriedades realmente precisavam ser públicas?
Será que o método Conectar não seria melhor tendo um escopo privado e retornando um MySqlConnection aberto pra você? Isso permitiria até você usar o tratamento Using, facilitando a leitura do bloco.
Esse Conectar público, com a propriedade Connection pública, pode ser um risco se alguém descobrir o endereço desse WebService também.

Abraços!
KERPLUNK 04/03/2017 18:59:42
#472149
Tenho quase certeza já ter te dito isso e já ter te passado mais de um exemplo de código disso, mas: Use OOP, assista meus vídeos e faça o que faço neles que esse problema do dispose não estar sendo executado na hora em que deveria vai desaparecer.
Tópico encerrado , respostas não são mais permitidas