Reputation: 7900
I try to run SELECT
on a table in MySql
and i get this error:
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
I run it on iis with .net and C#. Any idea how i can fix this problem?
This is for example how i make select:
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();
This is how i Delete:
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();
This is how i insert:
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;
Upvotes: 1
Views: 16082
Reputation: 216293
All the examples above show the same weakness. You don't use the using statement that will ensure the propert closing and disposing of the connection and other disposable objects. If one or more of your statements throw an exception, the code that close the connection is not executed and you could end with the too many connections error
For example
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(MySqlDataReader msdr = cmd.ExecuteReader())
{
while (msdr.Read())
{
//Read data
}
}
} // Here the connection will be closed and disposed. (and the command also)
Upvotes: 11
Reputation: 28608
Decrease the wait_timeout:
[mysqld]
wait_timeout=900
Because ADO.NET use connection pooling, it will keep your connection alive even if you dispose it. The solution is to tell MySQL to drop the connections.
Upvotes: 4