TOO MANY CONNECTIONS MYSQL
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.
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.
tem como vc postar pra nós a classe de conexão completa pra darmos uma avaliada??
Classe de conexao
String de conexao
Exemplo de Insert, update, delete
Exemplo de select:
Aparentemente fecho a conexao em todo momento. Está estranho isso.
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.
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
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
Nao deu certo OCELOT, no MySQL qual o correspondente a issto ?
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
Porém o CommandBehavior fica no namespace System.Data
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 !
Valeu por enquanto !
Galera, deu certo. Obrigado OCELOT, achava que o using fechava a conexão tbm..
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 ?
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 ?
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...
Neste topico o FoxMan postou uma solucao...
http://vbmania.com.br/index.php?modulo=forum&metodo=abrir&id=442770&pagina=2
http://vbmania.com.br/index.php?modulo=forum&metodo=abrir&id=442770&pagina=2
Tópico encerrado , respostas não são mais permitidas