Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当.NET运行时从连接池关闭(My)SQL连接时_C#_Mysql_.net_Connector Net - Fatal编程技术网

C# 当.NET运行时从连接池关闭(My)SQL连接时

C# 当.NET运行时从连接池关闭(My)SQL连接时,c#,mysql,.net,connector-net,C#,Mysql,.net,Connector Net,我最近读到了关于连接池(,) 连接池的目的是不应强迫MySQL客户端不断地进行连接和断开连接。因此,当连接的用户不再需要连接时,可以在MySQL客户端中缓存连接。因此,另一个需要连接到同一个MySQL服务器的用户可以在以后重用这个缓存连接(由Mikael Ronstrom编写) 这意味着: 我连接到MySQL服务器 执行一些查询 调用MySqlConnection.Close() 此时连接并没有关闭,而是保存在客户端(应用程序)的连接池中。如果我再次执行MySqlConnection.Open

我最近读到了关于连接池(,)

连接池的目的是不应强迫MySQL客户端不断地进行连接和断开连接。因此,当连接的用户不再需要连接时,可以在MySQL客户端中缓存连接。因此,另一个需要连接到同一个MySQL服务器的用户可以在以后重用这个缓存连接(由Mikael Ronstrom编写)

这意味着:

  • 我连接到MySQL服务器
  • 执行一些查询
  • 调用MySqlConnection.Close()
  • 此时连接并没有关闭,而是保存在客户端(应用程序)的连接池中。如果我再次执行MySqlConnection.Open(连接字符串),将从应用程序的连接池中创建/获取连接(连接轮询仅返回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连接是否会在等待超时后关闭。我是否应该在应用程序执行结束时(最后一行)调用ClearAllPool()

如果指定的MinPoolSize大于零,则在卸载AppDomain并结束进程之前,不会销毁连接池

进一步

发生致命错误(如故障转移)时,池将自动清除

因此,当应用程序退出时,连接将被清除


您应该能够通过建立连接来测试这一点,使用
close()
方法验证连接是否仍然打开,然后导致应用程序崩溃。

通常使用“使用”。它将处理您的连接并关闭it@apomene我同意,thnx。虽然在我的例子中,使用直接或自动调用conn.Dispose()没有任何效果。销毁意味着实际上调用了ClearAllPools(),或者.NET只是终止了此进程打开的TCP连接。@没有指定确切的底层过程,但是文档中明确指出,当发生致命错误(如故障转移)时,池会自动清除。,因此它会清除底层结构并关闭连接。我在一读时错过了这个,已经更新了答案。