0

我尝试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;
4

2 回答 2

4

在(本地)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,以确保尽快关闭它们,允许垃圾收集器清理不再使用的对象。

于 2013-06-13T09:40:44.017 回答
2

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

我会通过在 using 语句中包装 MySqlConnection 和命令来确保您正在关闭连接并隐式处理。

您能否发布一些关于您如何与数据库通信的代码。

这台服务器也是本地实例吗?

于 2013-06-13T09:45:23.510 回答