前言 在.NET中,連接池被廣泛用於管理和優化不同類型資源的連接。連接池可以減少建立和關閉連接所需的時間和資源消耗,從而提高了應用程式的性能和響應能力。 HttpClient中的連接池 System.Net.Http.HttpClient 類用於發送 HTTP 請求以及從 URI 所標識的資源接收 ...
前言
在.NET中,連接池被廣泛用於管理和優化不同類型資源的連接。連接池可以減少建立和關閉連接所需的時間和資源消耗,從而提高了應用程式的性能和響應能力。
HttpClient中的連接池
System.Net.Http.HttpClient 類用於發送 HTTP 請求以及從 URI 所標識的資源接收 HTTP 響應。 每個HttpClient 實例使用自身的連接池,當實例被釋放時,連接一會一同被釋放,所以為了緩解埠耗盡問題,應該儘量重用HttpClient實例。
我們可以控制HttpClient中的connection pool的行為
-
PooledConnectionLifetime 指的是當連接處於池中時保持活動狀態的時間長度。一旦這個生命周期到期,該連接將不再被保留在池中或用於未來的請求。預設為Infinite
-
PooledConnectionIdleTimeout 定義了空閑連接在未被使用時在連接池中保持的時間長度。一旦這個生命周期到期,空閑的連接將被清除並從池中移除。預設為兩分鐘
-
MaxConnectionsPerServer 定義了每個端點將建立的最大出站連接數。每個端點的連接分別進行池化。例如,如果最大連接數的值是2,而你的應用程式向www.github.com和www.google.com發送請求,則總共可能會有最多4個開放的連接。預設值為Int.MaxValue
DB連接池
DB連接池大家都耳熟能詳了,在這裡就不必贅述細節了,主要註意以下幾點:
-
選擇合適的Package, 比如針對MongoDB有很多連接方式,但是某些方式並沒有連接池,當技術選型時,一定要選擇正確的package。
-
每個connection string對應一個連接池
-
連接池有最大限制,sql server的最大連接預設為100
Redis連接池
在.NET中,大家都使用StackExchange.Redis來連接Redis,但是此Client Library並沒有Pool,大家可以考慮使用額外的第三方類庫比如StackExchange.Redis.ConnectionPool等
SMTP連接池
在.NET中,大家一般使用SmtpClient發送郵件,SmtpClient 實現將 SMTP 連接池化,以避免重新建立與同一伺服器的每條消息的連接開銷。 應用程式可以重覆使用同一 SmtpClient 對象將許多不同的電子郵件發送到同一 SMTP 伺服器.
但請註意,現在官方文檔推薦不使用SmtpClient, 而用MailKit替代,原因是Smtp不相容新的協議。