在使用 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/