连接太多异常

时间:2013-06-13 09:35:07

标签: c# mysql .net

我尝试在SELECT的表格上运行MySql,我收到此错误:

Server Error in '/MyApp' Application.
Too many connections
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: MySql.Data.MySqlClient.MySqlException: Too many connections

来源错误:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

堆栈追踪:

  

[MySqlException(0x80004005):连接太多]          MySql.Data.MySqlClient.MySqlStream.ReadPacket()+517          MySql.Data.MySqlClient.NativeDriver.Open()+ 702          MySql.Data.MySqlClient.Driver.Open()+ 245          MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder设置)+297          MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()+18          MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()+403          MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()+228          MySql.Data.MySqlClient.MySqlPool.GetConnection()+106          MySql.Data.MySqlClient.MySqlConnection.Open()+ 1468

     

版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.0.30319.1

我用.net和C#在iis上运行它。 知道如何解决这个问题吗?

修改

我从服务器添加了一些代码:

这是我如何选择:

MySqlDataReader msdr;

MySqlConnection connect = new MySqlConnection(connectionStringMySql);
MySqlCommand cmd = new MySqlCommand();

string commandLine = "SELECT * FROM Table WHERE active=1";

commandLine = commandLine.Remove(commandLine.Length - 3);
cmd.CommandText = commandLine;

cmd.Connection = connect;
cmd.Connection.Open();

msdr = cmd.ExecuteReader();

while (msdr.Read())
{
    //Read data
}
msdr.Close();
cmd.Connection.Close(); 

这是我删除的方式:

MySqlConnection connect = new MySqlConnection(connectionStringMySql);
MySqlCommand cmd = new MySqlCommand();

cmd.Connection = connect;
cmd.Connection.Open();

string commandLine = @"DELETE FROM Table WHERE id=@id;";

cmd.CommandText = commandLine;

cmd.Parameters.AddWithValue("@id", slotId);

cmd.ExecuteNonQuery();
cmd.Connection.Close();

这是我插入的方式:

MySqlConnection connect = new MySqlConnection(connectionStringMySql);
MySqlCommand cmd = new MySqlCommand();

cmd.Connection = connect;
cmd.Connection.Open();

string commandLine = @"INSERT INTO Table (id, weekday, start, end) VALUES" +
    "(@ id, @weekday, @start, @end);";

cmd.CommandText = commandLine;

cmd.Parameters.AddWithValue("@ id", item.babysitterid);
cmd.Parameters.AddWithValue("@weekday", item.weekday);
cmd.Parameters.AddWithValue("@start", new TimeSpan(item.starthour, item.startmin, 0));
cmd.Parameters.AddWithValue("@end", new TimeSpan(item.endhour, item.endmin, 0));

cmd.ExecuteNonQuery();
long id = cmd.LastInsertedId;
cmd.Connection.Close();
return id;

2 个答案:

答案 0 :(得分:4)

打开(本地)MySql监视器上的Admin页面,观察连接数是否随时间增长。如果这是意外行为,那么您的代码中可能有未闭合的连接对象(请参阅Steve在您的问题下面的评论)。如果这是意外,即您知道您的应用程序将生成并保持大量连接,那么您可能需要更改MySQL中的设置

https://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

调整max_connections

https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_connections

更新:如果您不期望并且不需要这么多打开的连接,并且想要确保您没有忽略任何close()语句,那么良好做法是在实现using的对象周围使用IDisposable构造,例如连接,以确保它们尽快关闭,允许垃圾收集器清理不再使用的对象。

答案 1 :(得分:2)

我不认为调整最大连接是正确的解决方案,直到确定问题是什么。它可能会给服务器增加更多压力/隐藏实际问题。

我会确保你通过在使用语句中包装MySqlConnection和命令来关闭连接和隐式处理。

你可以发布一些关于你如何与数据库通信的代码。

此服务器也是本地实例吗?