连接数过多异常

MTA*_*MTA 0 .net c# mysql

我尝试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
Run Code Online (Sandbox Code Playgroud)

来源错误:

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.
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

[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(); 
Run Code Online (Sandbox Code Playgroud)

这就是我删除的方式:

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();
Run Code Online (Sandbox Code Playgroud)

这就是我插入的方式:

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;
Run Code Online (Sandbox Code Playgroud)

dav*_*vek 5

打开(本地)MySql 监视器上的管理页面并观察连接数量是否随时间增长。如果这是意外行为,那么您的代码中可能有未关闭的连接对象(请参阅问题下方史蒂夫的评论)。如果这并不意外,即您知道您的应用程序将生成并保持大量连接,那么您可能需要更改 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,例如连接,以确保它们尽快关闭,允许垃圾收集器清理不再使用的对象。