連線池 sql server ado.net 使用

ForTechnology發表於2013-05-02
以前在做JSP時接觸過資料庫連線池,現在學了.net想學習下.net中怎麼使用連線池,經過一番搜尋,總結如下:

資料庫連結是一種危險的、昂貴的、有限的資源,特別是在多層Web應用程式中。你必須正確管理你的連結,因為你的方法將極大的影響應用程式的整體升級性。高效能應用程式與使用中的資料來源保持最短時間的連線,並且利用效能增強技術,例如連線池。連線池用於ODBC 的 SQL Server、OLE DB 和 .NET 框架資料提供程式隱式緩衝連線。通過在連線字串中指定不同的屬性值,可以控制連線池的行為。
連線池概述

資料庫連結池使應用程式能夠重用池中的現有連結,而不是重複地建立對資料庫的連結。這種技術將極大地增加應用程式的可擴充套件性,因為有限的資料庫連結可以為很多的客戶提供服務。此技術也將提高效能,因為能夠避免用於建立新連結的巨大時間。

具體來說,大多數 ADO.NET 資料提供程式使用連線池,以提高圍繞 Microsoft 斷開連線的 .NET 結構構建的應用程式的效能。應用程式首先開啟一個連線(或從連線池獲得一個連線控制程式碼),接著執行一個或多個查詢,然後處理行集,最後將連線釋放回連線池。如果沒有連線池,這些應用程式將花費許多額外時間來開啟和關閉連線。

下面將以SQL Server .NET Framework 資料提供程式連線池為例來說明連線池的一些效能和用法。(另外還有ODBC .NET Framework 資料提供程式連線池、OLE DB .NET Framework 資料提供程式連線池。)
池的建立和分配

當連線開啟時,將根據一種精確的匹配演算法來建立連線池,該演算法會使連線池與連線中的字串相關聯。每個連線池都與一個不同的連線字串相關聯。當新連線開啟時,如果連線字串不精確匹配現有池,則將建立一個新池。

在以下示例中,將建立三個新的 SqlConnection 物件,但只需要使用兩個連線池來管理這些物件。請注意,第一個和第二個連線字串的差異在於為 Initial Catalog 分配的值。

SqlConnection conn = new SqlConnection();

conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";

conn.Open();     

// Pool A is created.

 

SqlConnection conn = new SqlConnection();

conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";

conn.Open();     

// Pool B is created because the connection strings differ.

 

SqlConnection conn = new SqlConnection();

conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";

conn.Open();     

// The connection string matches pool A.

連線池一旦建立,直到活動程式終止時才會被毀壞。非活動或空池的維護只需要最少的系統開銷。

在使用SQL Server .NET資料供應器連結池時,必須清楚:

連結是通過對連結字串精確匹配的法則被池化的。池化機制對名稱-值對間的空格敏感。例如,下面的兩個連結字串將生成單獨的池,因為第二個字串包含了一個額外的空字元。

SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Database=Northwind");

conn.Open(); // Pool A is created

 

SqlConmection conn = new SqlConnection("Integrated Security=SSPI ; Database=Northwind");

conn.Open(); // Pool B is created (extra spaces in string)
連線的新增

連線池是為每個唯一的連線字串建立的。當建立一個池後,將建立多個連線物件並將其新增到該池中,以滿足最小池大小的要求。連線將根據需要新增到池中,直至達到最大池大小。

當請求 SqlConnection 物件時,如果存在可用的連線,則將從池中獲取該物件。若要成為可用連線,該連線當前必須未被使用,具有匹配的事務上下文或者不與任何事務上下文相關聯,並且具有與伺服器的有效連結。

如果已達到最大池大小且不存在可用的連線,則該請求將會排隊。當連線被釋放回池中時,連線池管理程式通過重新分配連線來滿足這些請求。對 Connection 呼叫 Close 或 Dispose 時,連線被釋放回池中。
連線的移除

如 果連線生存期已過期,或者連線池管理程式檢測到與伺服器的連線已斷開,連線池管理程式將從池中移除該連線。請注意,只有在嘗試與伺服器進行通訊後,才可以 檢測到這種情況。如果發現某連線不再連線到伺服器,則會將其標記為無效。連線池管理程式會定期掃描連線池,查詢已釋放到池中並標記為無效的物件。找到後, 這些連線將被永久移除。

如果存在與已消失的伺服器的連線,那麼即使連線池管理程式未檢測到已斷開的連線並將其標記為無效,仍有可能將此連線從池中取出。當發生這種情況時,將生成異常。但是,為了將該連線釋放回池中,仍必須將其關閉。
選擇池容量

能建立最大極限對於管理幾千使用者同時發出請求的大型系統來說是非常重要的。你需要監視連結池及應用程式的效能,以確定系統的最優池容量。最優容量還要依賴於執行SQL Server的硬體。

在開發期間,也許需要減小預設的最大池容量(目前是100)以幫助查詢連結洩漏。

如果設立了最小池容量,那麼當池最初被填充以達到該值時,會導致一些效能損失,儘管最初連結的幾個客戶會從中受益。注意,建立新連結的過程被序列化了,這就意味著當池最初被填充時,伺服器無法處理同時發生的請求。
監視連結池化

要監視應用程式對連結池化的應用情況,可以使用隨SQL Server發行的Profiler工具,或隨微軟Windows 2000發行的效能監視器。

要利用SQL Server Profiler 監視連結池化,操作如下:

1.         單擊開始,指向程式,指向Microsoft SQL Server,然後單擊Profiler執行Profiler。

2.         在檔案選單中,指向新建,然後單擊跟蹤。

3.         提供連結內容,然後單擊確定。

4.         在跟蹤屬性對話方塊中,單擊事件標籤。

5.         在已選事件類別列表中,確保稽核登入和稽核登出事件顯示在安全稽核下面。

6.         單擊執行開始跟蹤。在連結建立時,將會看到稽核登入事件;在連結關閉時看到稽核登出事件。

要通過效能監視器監視連結池化,操作如下:

1.         單擊開始,指向程式,指向管理工具,然後單擊效能執行效能監視器。

2.         在圖表背景中右擊,然後單擊增加計數器。

3.         在效能物件下拉選單框中,單擊SQL Server:通用統計。

4.         在出現的列表中,單擊使用者連結。
5.         單擊增加,然後單擊關閉。

連線池FAQ

    1. 何時建立連線池?

    當第一個連線請求到來時建立連線池;連線池的建立由資料庫連線的連線字元創來決定。每一個連線池都與一個不同的連線字串相關。當一個新的連線請求到來時如果連線字串和連線池使用的字串相同,就從連線池取出一個連線;如果不相同,就新建一個連線池。

    2. 何時關閉連線池?

    當連線池中的所有連線都已經關閉時關閉連線池。

    3. 當連線池中的連線都已經用完,而有新的連線請求到來時會發生什麼?

    當連線池已經達到它的最大連線數目時,有新的連線請求到來時,新的連線請求將放置到連線佇列中。當有連線釋放給連線池時,連線池將新釋放的連線分配給在佇列中排隊的連線請求。你可以呼叫close和dispose將連線歸還給連線池。

    4. 我應該如何允許連線池?

    對於.NET應用程式而言,預設為允許連線池。(這意味著你可以不必為這件事情做任何的事情)當然,如果你可以在SQLConnection物件的連線字串中加進Pooling=true;確保你的應用程式允許連線池的使用。

    5. 我應該如何禁止連線池?

    ADO.NET預設為允許資料庫連線池,如果你希望禁止連線池,可以使用如下的方式:

    1)        使用SQLConnection物件時,往連線字串加入如下內容:Pooling=False;

    2)        使用OLEDBConnection物件時,往連線字串加入如下內容:OLE DB Services=-4;

理論上明白了,再看下面的你就會懂得它的用法了,試試看:

連線池如何工作


連線池中包含開啟的可重用的資料庫連線。在同一時刻同一應用程式域中可以有多個連線池,但連線池不可以跨應用程式域共享。注意:一個連線池是通過一個唯一的連線字串來建立。連線池是根據第一次請求資料庫連線的連線字串來建立的,當另外一個不同的連線字串請求資料庫連線時,將建立另一個連線池。因此一個連線字元中對應一個連線池而不是一個資料庫對應一個連線池。如以下程式碼所示

程式碼1

// 新建一個連線池SqlConnection sqlConnection = new SqlConnection();sqlConnection.ConnectionString = "Server=localhost;Database=test;User ID=joydip;Password=joydip;Trusted_Connection=False";sqlConnection.Open();      程式碼2

// 因為連線字串不同,新建另一個連線池SqlConnection conn = new SqlConnection();sqlConnection.ConnectionString = "Server=localhost;Database=test;User ID=test;Password=test;Trusted_Connection=False";sqlConnection.Open();   程式碼3

// 因為連線字串與程式碼1相同,不再建立連線池.SqlConnection conn = new SqlConnection();sqlConnection.ConnectionString = "Server=localhost;Database=test;User ID=joydip;Password=joydip;Trusted_Connection=False";sqlConnection.Open();      當有新的資料庫連線請求到來時,連線池中連線進行了響應而不用建立一個新的資料庫連線,也就是說資料庫連線可以被重用,而不需要重新新建連線。因此這提高了應用程式的效率和可伸縮性。當你在應用程式中關閉一個開啟的資料庫連線時,該連線返回到連線池中等待重新連線直到等待超時。在這個時間內等待同一資料庫相同連線資訊的連線請求。如果這個時間內沒有連線請求,這個資料庫連線將被關閉,並從連線池中移除這個連線例項。

當一個新的連線池建立後,資料庫連線被新增到池中,連線池和池中的連線立即可被使用。連線池中將填滿連線字個串中指定的最小連線數量的連線。連線池中連線在長時間不活動或超出指定的生存期時將被移除。

連線池由連線池管理器維護。當後續的連線請求到來,連線池管理器在連線池中尋找可用的空閒的連線,如果存在就交給應用程式使用。以下描述了當一個新的連線請求到來時連線管理器如何工作

· 如果有未用連線可用,返回該連線

· 如果池中連線都已用完,建立一個新連線新增到池中

· 如果池中連線已達到最大連線數,請求進入等待佇列直到有空閒連線可用

通過連線字串中傳遞的引數可以控制連線池。基本的引數包括:

· Connect Timeout

· Min Pool Size

· Max Pool Siz

· Pooling

為了有效的使用連線池,記住資料庫操作完成後馬上關閉連線,這樣連線才能返回連線池中。

提高連線池效能


我們應該在最晚時刻開啟連線並在最早時刻釋放連線,即在使用完成後立即釋放。資料庫連線應該在真正請求資料時才開啟,而不應在使用之前就請求連線,這會減少池中可用連線的數量,因此有害於連線池的操作及應用程式效能。資料庫連線應使用完成後立即釋放,這能促進連線池更好的使用,因為連線可以返回池中被重新使用。以下程式碼展示如何在應用程式中有效地開啟和關閉連線

程式碼4

SqlConnection sqlConnection = new SqlConnection(connectionString);try{ sqlConnection.Open(); //Some Code} finally{ sqlConnection.Close();}程式碼4可以使用”using”關鍵字進一步簡化如以下程式碼所示

程式碼5

using(SqlConnection sqlConnection = new SqlConnection(connectionString)){ sqlConnection.Open(); //Some Code}

注:以上程式碼5中的”using”關鍵字將隱含地生成try-finally塊

以下列舉了更好地使用連線池的幾個可參考要點

1) 在需要使用時才開啟連線,並在完成操作後馬上關閉

2) 在關閉連線時先關閉相關使用者定義的事務

3) 確保維持連線池中至少有一個開啟的連線


4)在使用整合身份驗證的情況下避免使用連線池

連線池可以通過以下途徑進行監控

· 使用sp_who或sp_who2儲存過程

· 使用SQL Server的Profiler

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-759621/,如需轉載,請註明出處,否則將追究法律責任。

相關文章