一、問題引入
首先看段**:
string connstr =
"data source = desktop-8si7gc4;initial catalog = myschool;integrated security = true;"
sqlconnection conn =
newsqlconnection
(connstr)
; conn.
open()
;//並沒有釋放這個物件,只是將連線狀態關閉,同時清空連線字串。
//重新設定conn的connectionstring,即可重新連線證實了這點。
conn.
dispose()
; conn.connectionstring = connstr;
conn.
open()
;
一般來說,物件呼叫dispose()方法之後立即被銷毀,在記憶體中不復存在。但conn連線物件比較特別。conn呼叫dispose()方法之後,系統並沒有釋放這個物件,只是將其連線狀態關閉,同時清空連線字串。重新設定conn的connectionstring,即可重新連線證實了這點。類似字串。字串儲存在記憶體中的常量區。當我們建立乙個字串時,系統會先查明該字串是否存在常量區。如果存在,直接返回這個字串的位址。否則就新建乙個字串。
那為什麼conn呼叫dispose()方法之後沒有被銷毀呢?很好理解,為了節省記憶體和時間啊。只是,這涉及到了連線池。
二、示例
看下在有無連線池的兩種情況下,建立1000個連線物件所耗費的時間。
有連線池:
stopwatch sw =
newstopwatch()
; sw.
start()
;for
(int i =
0; i <
1000
; i++
) sw.
stop()
; messagebox.
show
(sw.elapsed.
tostring()
);
結果:0.1438238s
無連線池:在連線字串後新增了 +「pooling = false」 ,預設為true。
stopwatch sw =
newstopwatch()
; sw.
start()
;for
(int i =
0; i <
1000
; i++
) sw.
stop()
; messagebox.
show
(sw.elapsed.
tostring()
);
結果:4.1383434s
三、連線池的作用
簡單說,儲存連線通道物件。但它是如何達到節省時間和空間的目的呢?
當乙個連線通道使用完後,系統並不會將其釋放,而是將它儲存在連線池裡。下次需要使用連線通道的時候,系統會判斷連線池裡是否有空閒的連線通道物件。如果有,設定其連線字串,修改其連線狀態,重新使用。
mysql 連線池的作用 資料庫連線池的作用
對於乙個簡單的資料庫應用,由於對於資料庫的訪問不是很頻繁。這時可以簡單地在需要訪問資料庫時,就新建立乙個連線,用完後就關閉它,這樣做也不會帶來什麼明顯的效能上的開銷。但是對於乙個複雜的資料庫應用,情況就完全不同了。頻繁的建立 關閉連線,會極大的減低系統的效能,因為對於連線的使用成了系統效能的瓶頸。連...
資料庫連線池的作用
對於乙個簡單的資料庫應用,由於對於資料庫的訪問不是很頻繁。這時可以簡單地在需要訪問資料庫時,就新建立乙個連線,用完後就關閉它,這樣做也不會帶來什麼明顯的效能上的開銷。但是對於乙個複雜的資料庫應用,情況就完全不同了。頻繁的建立 關閉連線,會極大的減低系統的效能,因為對於連線的使用成了系統效能的瓶頸。連...
Spring 資料庫連線池的作用
引用 引用對於乙個簡單的資料庫引用,用於對資料庫的訪問不是很頻繁。這時就可以簡單的在需要訪問資料庫是,就建立乙個連線,用完後就關閉它,這樣做也不會帶來什麼明顯的效能上的開銷。但是對於乙個複雜的資料庫引用,情況就完全不同了。頻繁的建立 關閉連線,會極大的減低系統的效能,因為對於連線的使用成了系統效能的...