連接 mysql 時遇到 All pooled connections are in use 的例外錯誤

在使用 MySqlConnector 套件連接 mysql 的時候,偶發性的出現 MySqlConnector.MySqlException (0x80004005): Connect Timeout expired. All pooled connections are in use 錯誤,這裡將展示怎麼重現這個問題

上篇 出現的錯誤,相伴隨的也可能會出現另一種錯誤 All pooled connections are in use

測試工具與套件

c# 7.0
RoslynPad
MySqlConnector


重現方式

Step1 查詢現在的最大連線數

SHOW GLOBAL VARIABLES LIKE 'max_connections';

Step2 設定最大連線數量為 151 (只要大於預設的 mysql connector 的 pool size 100 條連線就好)

SET GLOBAL max_connections = 151;

Step3 使用 client1 建立100條連線後,並設定 connection pool 連線最大長度為 100,但是不關閉

預設 mysql connector MaximumPoolSize是100, 可以參考  https://mysqlconnector.net/connection-options/

#r "nuget: MySqlConnector, 2.3.5"
using System.Data;
using MySqlConnector;

for (var i = 1; i <= 100; i++)
{
   try
   {
       var db = GetDbConnection(@"Server=127.0.0.1;Database=db1;Uid=root;Pwd=123;Port=3306");
   }
   catch (Exception ex)
   {
       Console.WriteLine($"{i}, {ex}");
       break;
   }
}

"done with 100 conenctions".Dump();
try
{
   var db = GetDbConnection(@"Server=127.0.0.1;Database=db1;Uid=root;Pwd=123;Port=3306");
}
catch (Exception ex)
{
   Console.WriteLine($"{ex}");
}


"done with 101 conenctions".Dump();

IDbConnection GetDbConnection(string strConn)
{
   var connection = new MySqlConnection(strConn);
   if (connection.State != ConnectionState.Open)
   {
       connection.Open();
   }
   return connection;
}

因為預設 pool size 為 100個,當連線要往下建立 101個的時候 ,就會出現 Connect Timeout expired. All pooled connections are in use 的錯誤訊息


參考資料
https://dotblogs.com.tw/AceLee/2024/02/16/133323
https://mysqlconnector.net/connection-options/