我更多地使用 MySQL,遇到了一個問題,如果不親自試驗或深入研究,我似乎無法找到答案。
我用 MySQL 創建了一個池并正確釋放,但我看到在行程關閉之前仍然通過 MySQL Workbench 有一個活動連接。下面的代碼示例:
pool.getConnection((err, connection) => {
if (err) {
console.log(err);
return callback(err);
}
if (args.length > 2) {
sql_args = args[1];
}
connection.query(args[0], sql_args, (err, results) => {
connection.release();
if (err) {
console.log(err);
return callback(err);
}
callback(null, results);
});
});
這是連接保持打開的正常行為嗎?如果是這樣,如果我有數百個服務器連接到這個池并且所有服務器都發出請求但不是一次全部發出請求,并達到 MySQL 的最大連接限制,會發生什么?是否會清除不活動的連接(未使用)?
編輯 我想知道如果連接不關閉,運行較短的 TTL 是理想的還是某種型別的清除?我想讓 100 臺服務器適合最大 50 的連接并且不會出錯。
uj5u.com熱心網友回復:
這取決于連接池包的實作。
根據我的經驗,大多數連接池分配固定數量的連接,打開它們,并在應用程式的生命周期內保持它們永久連接。連接被“借”給需要訪問資料庫的客戶端代碼,當客戶端代碼完成后,連接回傳到池中,但并沒有與 MySQL 斷開連接。
如果連接意外斷開,連接池會創建一個新的替換連接,再次保持固定數量的就緒連接。它們保持永久連接,CP 可以維護它們。
是的,如果您有 100 個應用程式服務器,每個服務器分配一個包含 20 個連接的池,那么如果您運行 SHOW PROCESSLIST,您將看到 MySQL 服務器上始終連接著 2000 個客戶端。我們確實在我作業的生產環境中經常看到這種情況。
那是問題嗎?如果大多數連接空閑,MySQL 可以處理大量連接。max_connections例如,我們將其設定為 4096。但很少有超過 20-40 個在任何給定時刻實際執行查詢。事實上,如果Threads_running給定 MySQL 服務器實體上的 100 超過 100 ,我們會發出警報。
如果您有 100 個應用服務器,每個服務器都建立了 500 個連接的 CP 會怎樣?是的,這將在 MySQL 服務器上創建 50000 個連接,這可能超出了它的處理能力。但你為什么要這樣做?連接池的意義在于應用程式中的許多執行緒可以共享少量連接。
所以請注意,連接總數基本上是您的連接池大小乘以應用程式實體數。您甚至可能在每個應用服務器上擁有多個應用實體(例如,如果您運行 sidecar 行程等等)。所以它可以快速加起來。算一算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318721.html
