我最近阅读了有关连接池的信息(msdn,mysql documentation)。
连接池的目的是不应强迫MySQL客户端不断地进行连接和断开连接。因此,当连接的用户不再需要连接时,可以在MySQL客户端中缓存连接。因此,需要连接到同一MySQL服务器的另一个用户可以稍后重用此缓存连接(由Mikael Ronstrom提供)。
这意味着:
我测试了这段代码:
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应用程序崩溃会发生什么,在wait_timeout通过后,MySQL连接是否会关闭。我应该在应用程序执行结束时调用ClearAllPool()(最后一行)。
答案 0 :(得分:1)
从您指定的MSDN链接
如果指定的 MinPoolSize 大于零,则在卸载 AppDomain 并且流程结束之前,不会销毁连接池。
进一步
发生致命错误时会自动清除池,例如故障转移。
因此,当应用程序退出时,将清除连接。
您应该能够通过建立连接来测试这一点,在使用close()
方法之后验证它仍处于打开状态,然后导致应用程序崩溃。