連接池 打開與關閉數據庫都是比較耗時的。爲此,ADO.NET自動將數據庫連接存放在連接池中。
連接池可以大幅度提高程序的性能和效率,因爲我們不必等待建立全新的數據庫連接過程,
而是直接利用現成的數據庫連接。注意,利用Close()方法關閉連接時,並不是實際關閉連接,
而是將連接標爲未用,放在連接池中,準備下一次複用。 如果在連接字符串中提供相同的細節,
即相同的數據庫,用戶名,密碼等等,則可以直接取得並返回池中的連接。然後可以用這個連接訪問數據庫。
使用SqlConnection對象時,可以在連接字符串中指定max pool size,表示連接池允許的最大連接數(默認爲100),
也可以指定min pool size表示連接池允許的最小連接數(默認爲0)。
下面的代碼指定了SqlConnection對象的max pool size爲10,min pool size爲5。
SqlConnection mySqlConnection = new SqlConnection
("server=localhost;database=Northwind;integrated security=SSPI;"+"max pool size=10;min pool size=5");
程序代碼說明:在上述範例的程序代碼中,程序最初在池中生成5個SqlConnection對象。池中可以存儲最多10個SqlConnection對象。
如果要打開新的SqlConnection對象時,池中的對象全部都在使用中,則請求要等待一個SqlConnection對象關閉,然後纔可以使用新的SqlConnection對象。
如果請求等待時間超過ConnectionTimeout屬性指定的秒數,則會拋出異常。
下面通過一個程序來顯示連接池的性能優勢。在應用此程序過程我們要先引用System.Data.SqlClinet和System.Text命名空間。
範例程序代碼如下: 01 public partial class _Default : System.Web.UI.Page
02 {
03 protected void Page_Load(object sender, EventArgs e)
04 {
05 //設置連接池的最大連接數爲5,最小爲1
06 SqlConnection mySqlConnection =new SqlConnection(
07 "server=localhost;database=Northwind;integrated security=SSPI;"+
08 "max pool size=5;min pool size=1");
09 //新建一個StringBuilder對象
10 StringBuilder htmStr = new StringBuilder("");
11 for (int count = 1; count <= 5; count++)
12 {
13 //使用Append()方法追加字符串到StringBuilder對象的結尾處
14 htmStr.Append("連接對象 "+count);
15 htmStr.Append("<br>");
16 //設置一個連接的開始時間
17 DateTime start = DateTime.Now;
18 mySqlConnection.Open();
19 //連接所用的時間
20 TimeSpan timeTaken = DateTime.Now - start;
21 htmStr.Append("連接時間爲 "+timeTaken.Milliseconds+"毫秒");
22 htmStr.Append("<br>");
23 htmStr.Append("mySqlConnection對象的狀態爲" + mySqlConnection.State);
24 htmStr.Append("<br>");
25 mySqlConnection.Close();
26 }
27 //將StringBuilder對象的包含的字符串在label控件中顯示出來
28 lblInfo.Text = htmStr.ToString();
29 }
30 }
程序代碼說明:在上述範例的程序代碼中,我們將在連接池中重複5次打開一個SqlConnection對象,
DateTime.Now表示當前的時間。timeTaken表示從連接開始到打開連接所用的時間間隔。
可以看出,打開第一個連接的時間比打開後續連接的時間要長,因爲第一個連接要實際連接數據庫。
被關閉之後,這個連接存放在連接池中。再次打開連接時,只要從池中直接讀取即可,速度非常快。
提示:String 對象是不可改變的。每次使用 System.String 類中的方法之一時,
都要在內存中創建一個新的字符串對象,這就需要爲該新對象分配新的空間。
在需要對字符串執行重複修改的情況下,與創建新的 String 對象相關的系統開銷可能會非常昂貴。
如果要修改字符串而不創建新的對象,則可以使用 System.Text.StringBuilder 類
。例如,當在一個循環中將許多字符串連接在一起時,使用 StringBuilder 類可以提升性能。
Append 方法可用來將文本或對象的字符串表示形式添加到由當前
StringBuilder 對象表示的字符串的結尾處。