我最近阅读了有关连接池的内容(msdn、mysql 文档)。
连接池的目的是不应该强迫 MySQL 客户端不断地进行连接和断开连接。因此,当连接的用户不再需要连接时,可以在 MySQL 客户端中缓存连接。因此,需要连接到同一个 MySQL 服务器的另一个用户可以稍后重用这个缓存的连接(由 Mikael Ronstrom 提供)。
这意味着:
- 我连接到 MySQL 服务器
- 执行一些查询
- 调用 MySqlConnection.Close()
- 此时连接没有关闭,它保存在客户端(应用程序)的连接池中。如果我再次执行 MySqlConnection.Open(connection string),将从应用程序的连接池中创建/获取连接(连接轮询仅返回 MySqlConnection 的实例)。
我用这段代码测试过:
MySqlConnection conn = new MySqlConnection("server=localhost;uid=user;pwd=pass;database=dbname;Pooling=true");
try
{
conn.Open();
Console.WriteLine("Connected to sql server");
}
catch (MySqlException e)
{
Console.WriteLine("Error connecting to sql server ["+e.Message+"]");
}
MySqlCommand cmd = new MySqlCommand("select * from table1 where id = 1", conn);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string a = reader.GetString(0);
}
reader.Close();
try
{
conn.Close();
}
catch (MySqlException e) {}
// I connected to MySQL server via terminal and executed 'show full processlist'
// connection was still present
// If I add MySqlConnection.ClearAllPools(); connection was closed (everything as it should)
此时.NET 运行时调用连接器 MySqlConnection.ClearAllPools(); 或 MySqlConnection.ClearPool() 静态方法?这些方法实际上关闭了与 MySQL 服务器的连接。如果 .NET 应用程序崩溃,MySQL 连接会在 wait_timeout 过后关闭吗?我是否应该在应用程序执行结束时调用 ClearAllPool()(最后一行)。