C#MySQL中的连接太多

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

  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 Source Error: 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. Stack Trace: [MySqlException (0x80004005): Too many connections] MySql.Data.MySqlClient.MySqlStream.ReadPacket() +517 MySql.Data.MySqlClient.NativeDriver.Open() +702 MySql.Data.MySqlClient.Driver.Open() +245 MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) +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 Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version: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", id); 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; 

上面的所有例子都表明了同样的弱点。 您不使用using语句来确保关闭和处理连接以及其他一次性对象。 如果您的一个或多个语句抛出exception,则不会执行关闭连接的代码,并且可能以太多连接错误结束

例如

 string commandLine = "SELECT * FROM Table WHERE active=1"; commandLine = commandLine.Remove(commandLine.Length - 3); using(MySqlConnection connect = new MySqlConnection(connectionStringMySql)) using(MySqlCommand cmd = new MySqlCommand(commandLine, connect)) { connect.Open(); using(SqlDataReader msdr = cmd.ExecuteReader()) { while (msdr.Read()) { //Read data } } } // Here the connection will be closed and disposed. (and the command also) 

减少wait_timeout :

 [mysqld] wait_timeout=900 

因为ADO.NET使用连接池,所以即使你处理它也会使你的连接保持活动状态。 解决方案是告诉MySQL删除连接。