2008年11月17日 星期一

ADO.NET Connection Pooling

何謂 connection pool ?

就是為了要節省開啟、關閉資料庫連線時所造成大量的資源與時間耗損所設計出來的機制。

 

如何達成以上目的的呢 ?

以下直接引用 MSDN2 的解釋來說明:

Connection pooling reduces the number of times that new connections must be opened. The pooler maintains ownership of the physical connection. It manages connections by keeping alive a set of active connections for each given connection configuration. Whenever a user calls Open on a connection, the pooler looks for an available connection in the pool. If a pooled connection is available, it returns it to the caller instead of opening a new connection. When the application calls Close on the connection, the pooler returns it to the pooled set of active connections instead of closing it. Once the connection is returned to the pool, it is ready to be reused on the next Open call.

從上面可以瞭解,一旦當 connection string 被指定後,ADO.NET 會自動產生多個 active connection 並置於 connection pool 中。

一旦程式中有 connection open() 的動作,就直接從 pool 中拉出一個 active connection 並回傳;若程式中有 connection close() 或是 Dispose() 的動作,則是直接將 connection 歸還給 pool,不會實際將 connection 關閉。

【注意】前提是這些 connection 的 connection string 是一致的,才會使用到同一個 connection pool 所提供的 connection。

 

Connection Pool 之間是如何區別的呢 ?

以下直接引用 MSDN2 的解釋來說明:

Connections are pooled per process, per application domain, per connection string and when integrated security is used, per Windows identity.

可以知道,connection pool 可以同時不只有一個(若是同時利用兩個不同的 connection string 產生 connection),可以同時有多個存在;而不同 process、不同的 application domain、不同的 connection string、甚至不同的 Windows identity 都會產生不同的 connection pool 來維護各自的資料庫連線。

 

要如何才能使用 Connection Pool 的功能呢 ?

以下直接引用 MSDN2 的解釋來說明:

Pooling connections can significantly enhance the performance and scalability of your application. By default, connection pooling is enabled in ADO.NET. Unless you explicitly disable it, the pooler optimizes the connections as they are opened and closed in your application. You can also supply several connection string modifiers to control connection pooling behavior.

恩…微軟直接在 ADO.NET 預設開啟 Connection Pooling 的機制了,想要關閉或是進行調整的話,可以在 connection string 中指定。只要指定好 connection string,開始連線時,ADO.NET 就會自動建立 connection pool 供程式使用了!

 

Connection Pool 中的連線預設都不關閉嗎 ?

以下直接引用 MSDN2 的解釋來說明:

If MinPoolSize is either not specified in the connection string or is specified as zero, the connections in the pool will be closed after a period of inactivity. However, if the specified MinPoolSize is greater than zero, the connection pool is not destroyed until the AppDomain is unloaded and the process ends.

因此可以知道,在 connection string 中的「MinPoolSize」屬性設定,會影響到資料庫連線在 connection pool 中是否會自動關閉。

 

Connection Pooling 細節的運作機制

以下直接引用 MSDN2 的解釋來說明:

The connection pooler satisfies requests for connections by reallocating connections as they are released back into the pool. If the maximum pool size has been reached and no usable connection is available, the request is queued. The pooler then tries to reclaim any connections until the time-out is reached (the default is 15 seconds). If the pooler cannot satisfy the request before the connection times out, an exception is thrown.

很清楚的,可以知道 ADO.NET connection pooling 的運作機制如下:

  1. 基本上 pooler 會盡量滿足來自程式中資料庫連線的需求。
  2. 但若是到達 pool 所擁有的最大連線數,已經沒有任何 connection 可用時,此時資料庫連線的 request 會存放在佇列中。
  3. 若佇列中有 request 存在,pooler 就會持續的向已經 timeout 的 connection 要求收回連線。
  4. 若在 request timeout 的時限內都還沒有 connection 可用,例外就會發生並拋出。

 

何謂 Pool Fragmentation ?

常發生在 web application 中,原因是因為在 process 運作的期間產生了太多個 connection pool,因此 web server 必須維護大量的 connection,造成資源的虛耗,此種現象稱為「Pool Fragmentation」。

 

為何會發生 Pool Fragmentation ?

發生 Pool Fragmentation 可能會有兩種原因:

使用 Windows Authentication 的方式進行使用者認證

有些 web application 會採用 Windows Authentication 的方式認證使用者,而先前提過,使用不同的 windows identity 進行資料庫連線要求時,會產生不同的 connection pool,而當 connection pool 產生時,會預設產生出數個 connection 以供未來資料庫連線要求之用。

因此若要解決這個問題,可以將使用者認證的資訊存於資料庫中,進行認證時,只要統一經由相同的連線向相同的存取認證資訊即可。

同時連結多個資料庫

連結多個資料庫表示 connection string 會不同,當 connection string 不同時,相對的也會產生出不同的 connection pool。

而要解決這個問題,可以透過 SQL 語法中的「USE」關鍵字,直接在同一個連線中轉移資料庫並進行相關資料的擷取。

 

參考資料

  1. MSDN2 - Connection Pooling (ADO.NET)

  2. 康廷數位: 停用 Connection Pooling 機制

  3. ASP.NET 2.0 網站、Oracle connection pooling 問題 - Huan-Lin 學習筆記

  4. 邱英瑞(Jacky) : 如何證明 ADO.NET 預設有使用 Connection Pooling 的機制

  5. Close, Dispose, using And Connection Pool

 

實作相關資訊

  1. ADO.NET Connection Pooling Explained | O'Reilly Media

  2. 15 Seconds : Tuning Up ADO.NET Connection Pooling in ASP.NET Applications

  3. CodeProject: ADO.NET Connection Pooling at a Glance.

  4. ADO.NET Connection Pooling at a Glance

沒有留言:

張貼留言