TOO MANY CONNECTIONS MYSQL

FBGSYSTEMS 22/05/2015 09:08:32
#446913
Bom dia galera.
Meu sistema feito em C# a partir deum certo tempo(que ainda nao sei qual) começa a apresentar o erro Too Many Connections do mysql.

Todas operações com banco de dados eu fecho a conexao assim que termino.
Operações de insert, update e delete eu faço asim

try{
//operacao
}catch(){

}finally{
//desconecto
}


E as operações de select faço assim:

using (mysqlcomand blablabla (query, conexao))

{

}
Teoricamente o using fecha a conexao assim que for usada, ou estou errado ?

O que pode estar acontecendo? Apenas 4 ou 5 máquinas estao usando o sistema ao mesmo tempo.
Coisa importante é que tenho um outro usuario do mysql que uso no ODBC para exibir os relatorios do crystal reports.
ACCIOLLY 22/05/2015 09:22:02
#446915
tem como vc postar pra nós a classe de conexão completa pra darmos uma avaliada??
FBGSYSTEMS 22/05/2015 09:30:47
#446917
Classe de conexao

        public string conectaMySql()
{
try
{

string connectionString =
ConfigurationManager.ConnectionStrings[[Ô]MinhaStringDeConexao[Ô]].ConnectionString;
// tentando conectar na base de dados
string strCon = connectionString.Replace([Ô]@password[Ô], [Ô]senha[Ô]);

conexao = new MySqlConnection (strCon);
conexao.Open();
}
// aqui retorna o erro
catch (MySqlException erro)
{
this.err = erro.Message;
}

// verifica se a conexao foi aberta com sucesso
if (conexao.State == ConnectionState.Open)
{
return [Ô]Conectou[Ô];
}
else
{
conexao.Close();
return this.err;
}
}

String de conexao
<add name=[Ô]MinhaStringDeConexao[Ô] connectionString=[Ô]Server=192.168.1.254;Database=database;Uid=usuario;Pwd=@password;Connect Timeout=30;allow zero datetime=true;[Ô]/>   


Exemplo de Insert, update, delete
        public string insertLog()
{
string retornoConexao;
databases conecta = new databases();
retornoConexao = conecta.conectaMySql();
// abre a instancia do comando SQL


if (retornoConexao != [Ô]Conectou[Ô])
{
return retornoConexao;
}
else
{

try
{
MySqlCommand insert = new MySqlCommand();
this.sql = [Ô]insert into log_operacoes (codempresa,operacao,observacao,data,hora,codusuario,terminal) VALUES [Ô] +
[Ô](@codempresa,@operacao,@observacao,@data,@hora,@codusuario,@terminal)[Ô];

insert.Connection = conecta.conexao;
insert.CommandText = this.sql;
insert.Parameters.AddWithValue([Ô]@codempresa[Ô], clsUsuarioSessao.CodEmpresa);
insert.Parameters.AddWithValue([Ô]@operacao[Ô], operacao);
insert.Parameters.AddWithValue([Ô]@observacao[Ô], observacao);
insert.Parameters.AddWithValue([Ô]@data[Ô], data);
insert.Parameters.AddWithValue([Ô]@hora[Ô], hora);
insert.Parameters.AddWithValue([Ô]@codusuario[Ô], clsUsuarioSessao.Codigo);
insert.Parameters.AddWithValue([Ô]@terminal[Ô], Environment.MachineName);

insert.ExecuteNonQuery();
log.FullCommandText(insert);
return [Ô]Dados inseridos com sucesso![Ô];
}
catch (MySqlException erro)
{
this.err = erro.Message;
return this.err;
}
finally
{
conecta.desconectaMySql();
}
}
}


Exemplo de select:
        public List<clsNcm> GetNcm(string where)
{
List<clsNcm> _return = null;
string retornoConexao;
databases conecta = new databases();
retornoConexao = conecta.conectaMySql();
// abre a instancia do comando SQL
if (retornoConexao != [Ô]Conectou[Ô])
{
return _return;
}
else
{
this.sql = [Ô]select * from ncm[Ô];

if (where != [Ô][Ô])
{
this.sql = this.sql + (functions.Left (where,7) != [Ô] where [Ô]? [Ô] where [Ô]: [Ô][Ô]) + where;
}

using (MySqlCommand cmd = new MySqlCommand(this.sql,conecta.conexao))
{
using (MySqlDataReader dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
_return = new List<clsNcm>();

while (dr.Read())
{
clsNcm n = new clsNcm();
n.codigo = dr.GetInt32(dr.GetOrdinal([Ô]codigo[Ô]));
n.tabela = dr.GetString(dr.GetOrdinal([Ô]tabela[Ô]));
n.ncm = dr.GetString(dr.GetOrdinal([Ô]ncm[Ô]));
n.aliquota = dr.GetDouble(dr.GetOrdinal([Ô]aliquota[Ô]));
n.aliquota_importado = dr.GetDouble(dr.GetOrdinal([Ô]aliquotaimportado[Ô]));
if (dr[[Ô]aliquotapersonalizado[Ô]] != DBNull.Value)
{
n.aliquota_personalizada = dr.GetDouble(dr.GetOrdinal([Ô]aliquotapersonalizado[Ô]));
}
if (dr[[Ô]aliquotaimportadopersonalizado[Ô]] != DBNull.Value)
{
n.aliquota_personalizada_importado = dr.GetDouble(dr.GetOrdinal([Ô]aliquotaimportadopersonalizado[Ô]));
}
if (dr[[Ô]codpis[Ô]] != DBNull.Value)
{
n.codpis = dr.GetString(dr.GetOrdinal([Ô]codpis[Ô]));
}
if (dr[[Ô]codcofins[Ô]] != DBNull.Value)
{
n.codcofins = dr.GetString(dr.GetOrdinal([Ô]codcofins[Ô]));
}
if (dr[[Ô]aliqestadual[Ô]] != DBNull.Value)
{
n.aliqestadual = dr.GetDecimal(dr.GetOrdinal([Ô]aliqestadual[Ô]));
}
_return.Add(n);

}
}
return _return;
}
}
}
}


Aparentemente fecho a conexao em todo momento. Está estranho isso.
OCELOT 22/05/2015 11:19:35
#446923
No seu exemplo do Select você não está realmente fechando a conexão.

O using sozinho não fecha a conexão, ele apenas garante que o Dispose seja chamado, porém ele está sendo chamado apenas para o MySqlDataReader e o MySqlCommand, não para o MySqlConnection.

Neste caso é bem fácil corrigir, seria só mudar a linha

using (MySqlDataReader dr = cmd.ExecuteReader())

para

using (MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

Desta forma sim, quando o DataReader for finalizado pelo Dispose ele deve fechar a conexão também
FBGSYSTEMS 22/05/2015 11:25:56
#446924
Nao deu certo OCELOT, no MySQL qual o correspondente a issto ?
OCELOT 22/05/2015 11:32:02
#446925
Não tenho realmente experiencia com o MySQL, mas deveria ser exatamente isso, vide documentação: https://www.devart.com/dotconnect/mysql/docs/Devart.Data.MySql~Devart.Data.MySql.MySqlCommand~ExecuteReader%28CommandBehavior%29.html

Porém o CommandBehavior fica no namespace System.Data
FBGSYSTEMS 22/05/2015 11:44:43
#446927
Acho que deu certo. é que nao tinha utilizado essa biblioteca.. ai coloquei com o System.Data....Vou tentar aqui e te falo se deu certo ou nao.
Valeu por enquanto !
FBGSYSTEMS 22/05/2015 18:03:06
#446939
Galera, deu certo. Obrigado OCELOT, achava que o using fechava a conexão tbm..
FBGSYSTEMS 22/09/2015 17:16:44
#451702
Galera, depois de um tempo voltou a dar o mesmo problema.
Detalhe que acrescentei no final de cada using um conecta.desconectaMysql().

Estou desconfiando que ao abrir vários RPT a conexão nao se feche automaticamente. Alguem mais sabe como me ajudar ?
KURTGU 22/09/2015 18:04:08
#451705
A uns tempos atras estava com este mesmo erro ate postei aqui e me dera uma solucao...vou procurar o topico e posto aqui pra te ajudar...
KURTGU 22/09/2015 18:06:10
#451706
Neste topico o FoxMan postou uma solucao...

http://vbmania.com.br/index.php?modulo=forum&metodo=abrir&id=442770&pagina=2


Página 1 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas