調用ADO.NET重要特性說明
對于微軟出來的調用ADO.NET的使用說明,及MSDN站點都推薦大家使用ADO.NET,用這樣的方式來創建Connection,調用ADO.NET會自動執行Connection.dispose()方法,所以能夠確保Connetion被及時的關閉。
那么及時的調用.dispose()真的這么重要么,調用ADO.NET如果一個對象超出了生存空間,在.net中不是會自動被GC(垃圾回收器)自動清理的么?
這個問題其實是由于GC導致的,.net中使用的GC,他對于工作并不像我們這樣勤奮。調用ADO.NET只有當外界環境極其惡劣的時候(沒有足夠的內容分配的時候)他才會動手打掃衛生(清理不使用的對象)。所以對于Connection 即使超出了變量的生命周期,它可能還沒有被GC干掉。
依舊未將調用ADO.NET返回給Connection Pool,所以這就導致了下一個連接可能會有調用ADO.NET中沒有Available的Connection而從新打開一個新的連接,無端的浪費了多余的性能。所以ADO.net team反復強調要及時的關閉當前的連接。一個***的方法就是使用using{}block 系統會在退出{}的時候自動調用connection.dispose方法,而dispose會自動去執行close方法,釋放當前的connection。
其實Connection.dispose方法就是call了一次close方法,所以兩者是等同的。也就是說,如果您及時的執行了connection.close()方法,就沒有必要必須再把connection包裹在一個using(){}中。#t#
如果使用調用ADO.NET是必需的,那么如果程序結構導致我無法使用using(){}來包裹我的Connection,比如說我的Connection是同一個help類返回的,那我又怎么辦呢?
這是一個經常遇到的問題。在這樣的環境中,我們無法將整個connection包裹在一個connection中。解決這樣的方法有兩個,一個就是修改您的代碼結構。傳入一個ConnectionString來返回調用ADO.NET。另一個方法就是反復檢查您的代碼,是否及時關閉了Connection。
因為Close的效果與dispose是相同的。但是如果不使用using(){}這個及時關閉Connection的任務就等于是交到了我們自己的手上,而不再由.net framework為我們把關了。