于是準備花點時間解答下,順便為這個月增添一篇文章。
下面将對原文,解答兩個問題:
一: DataReader、DataTable、DataSet 的簡單關系:
這裡先取原文的第一句話:.net讀取資料集有兩種方式:DataSet 和 DataReader
解答:.net 的Command操作裡,預設可以有三種傳回:DataReader、DataTable、DataSet
這三者的簡單關系為:
DataReader 快速隻向前讀的流,需要開發者自己去關閉流。
DataTable 一個容器,把DataReeader讀到DataTable容器後關閉流。
DataTable 一個大容器,裡面可放置多個DataTable。
是以開發者,首先要明白這三者的簡單關系,才不至于亂猜。
二:資料庫連結、連結池、close與dispose
這裡再取原文的第N句話:在sqlserver(2000)中檢視程序,有非常多的sleeping程序,直到最後打開頁面,提示逾時,說連接配接池滿。
解答:預設mssql的連結數是有限的,大體在100多個,簡單的說你可以open 100多次而不關閉,超過後再open就會出現連結池不夠的現象。
這之間的簡單關系為:
第一次Open對外連結接時,連接配接資料庫(由于是首次建立連結,需要初始化先多資訊,就是傳說的性能問題)
然後你Close時,資料庫斷開連結,同時把連結狀态改成sleep,但是不銷毀(為了下次建立連結時省掉初始化,避免傳說中的性能問題),這個不銷毀的連結,放到一個池裡面,被稱之為連結池。
如果你Dispose(),則會把連結從池裡銷毀,當然下次連結就會開始新的初始化。
下面就會有很多種情況出現:
情況一:一個線程的正常操作:
如果使用時一個流程下來,是按順序的open->close-open->close 狀态,那麼始終隻用到一個連結(從連接配接池裡進進出出),基本沒有過多的初始化問題,傳說性能好。
情況二:多個線程的不正常操作:
如果你一個連結,在Open狀态,這時候另一個線程也要打開連結,發現連結池沒有時,就會重新到資料庫建一個連結(又開始初始化,一堆資訊,最後産生一個連結)。
如果你所有的連結全在Open,不關閉,或者時間拖的很多,在其它線程要連結的時候,你的連結還沒關閉,在産生100多個連結後,資料庫最大數滿了,就會出現“連結池已滿”的情況。
情況三:多個線程的正常操作:
如果你懂的每個連結打開後,都快速關閉,通常一個正常語句的操作時間在0.001-0.1秒左右,這樣關閉的連結就回到池裡,可以快速供給其它線程使用。
這樣,僅需要幾十個連結,就可以循環的使用處理多線程問題。
簡單的假設:
如果一個操作open到close,用時0.1秒一次, 那麼一個連結在1秒内可以處理10次操作。而100個連結最大數就可以支援1000次操作。
簡單的說就是1秒可以并發操作1000次以上,這對中小網站來說,處理是相當容易的事。
而新手容易犯的錯誤,就是連結打開後,長時間的不關閉,最後導緻在多線程的情況下,把資料庫連結資源用盡了,出現了錯誤而不得知。
進一步的假設:
在很多的程式進行中,對資料庫的操作時間,往往是不平均的,這就需要有點經驗的程式開發者,花點時間,來搞好這最大并發問題,通常是:
對長時間查詢的,使用緩存(避免二次查詢),或者集中使用隊列(因為使用隊列,就一個連結就可以搞定了,反正是開了讀和關,然後下一個又是開了讀和關,始終是一個連結),當然使用隊列也要看情況。
對于時間短的,直接處理就可以了。
其實說白了,越往上,就越是“看情況處理”,沒有啥定律,要是有,那就是資料庫的最大連結數,無論你怎麼耍流氓,反正你不能讓它一次性給用完。
本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/840053,如需轉載請自行聯系原作者