簡體   English   中英

.NET運行時關閉連接池中的(My)SQL連接

[英]When .NET runtime closes (My)SQL connections from connection pool

我最近閱讀了有關連接池的信息( msdnmysql文檔 )。

連接池的目的是不要強迫MySQL客戶端不斷進行連接和斷開連接。 因此,當連接的用戶不再需要連接時,可以將連接緩存在MySQL客戶端中。 因此,另一個需要連接到同一MySQL Server的用戶可以稍后再使用此緩存的連接(由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應用程序崩潰,在wait_timeout過去之后,MySQL連接是否關閉,該怎么辦? 我應該在應用程序執行結束時(最后一行)調用ClearAllPool()嗎?

從您指定的MSDN鏈接

如果指定的MinPoolSize大於零,則直到AppDomain卸載並且過程結束,連接池才會被銷毀。

進一步

當發生致命錯誤(例如故障轉移)時,池將自動清除。

這樣,當應用程序退出時,連接將被清除。

您應該能夠通過以下方式進行測試:建立連接,使用close()方法驗證其是否仍處於打開狀態,然后導致應用程序崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM