程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 理解.NET中的數據庫連接池

理解.NET中的數據庫連接池

編輯:.NET實例教程
理解.Net中的數據庫連接池
作者 Joydip Kanjilal

摘要:

       連接池能在程度上提高數據庫訪問性能。本文討論到底何為連接池,它如何提高數據庫訪問性能,以及如何在.Net中創建連接池並增加或移除連接。

 

導言

       連接數據庫是應用程序中耗費大量資源且相對較慢的操作,但它們又是至關緊要的。連接池是已打開的及可重用的數據庫連接的一個容器。連接池在所有的數據庫連接都關閉時才從內存中釋放。使用連接池最基本的好處是提高應用程序的性能及可伸縮性,而其主要缺點是會有一個或多個數據庫連接將一直保持打開狀態,即使當前不在使用。ADO.Net的Data Providers將默認情況下將使用連接池,如果你不想使用連接池,必須在連接字符串中指定”Polling=false”。連接池中為你提供了空閒的打開的可重用的數據庫連接,而不再需要每次在請求數據庫數據時新打開一個數據庫連接。當數據庫連接關閉或釋放時,將返回到連接池中保持空閒狀態直到新的連接請求到來。如果我們有效地使用連接池,打開和關閉數據庫將不再很耗費資源。本文討論連接池的相關內容以及如何有效的使用連接池來提高應用程序的效率及可伸縮性。

 

連接池如何工作

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

代碼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塊
 

 

 

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

·         在需要使用時才打開連接,並在完成操作後馬上關閉

·         在關閉連接時先關閉相關用戶定義的事務

·        確保維持連接池中至少有一個打開的連接

·         在使用集成身份驗證的情況下避免使用連接池

 

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

·         使用sp_who或sp_who2存儲過程

·        使用SQL Server的Profiler

·        使用性能監視器的性能計數器

 

參考文獻

Tuning Up ADO.NET Connection Pooling in ASP.Net Applications

Connection Pooling for the .Net Framework Data Provider for SQL Server

The .Net Connection Pool Lifeguard

ADO.Net Connection Pooling Explained

 

結語

       連接池是數據庫連接對象的容器,只要其中存在活動的或打開的連接它維持活動狀態。當使用一個連接字符串來請求數據庫連接時,將分配一個新的連接池。通過在應用程序中使用相同的連接字符串我們可以提高應用程序的性能和可伸縮性。然而如果我們不正確地使用連接池可能給我們的應用程序帶來負效果。MSDN中說“連接是提高應用程序性能的有力工具,但如果使用不當連接池非但不是有益的而且是害的”。本文討論了連接池的相關內容以及如何有效的使用連接池來提高應用程序的效率及可伸縮性。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved