在線(xiàn)客服
24小時(shí)免費(fèi)咨詢(xún)電話(huà):18978941786
客服時(shí)間:上午9:30~下午6點(diǎn)
當(dāng)前位置:首頁(yè)>> 技術(shù)文章 >> Web開(kāi)發(fā) >> .NET開(kāi)發(fā)網(wǎng)站過(guò)程中易被忽視的問(wèn)題
.NET開(kāi)發(fā)網(wǎng)站過(guò)程中易被忽視的問(wèn)題
收藏 分享 發(fā)布日期:2012-2-12 16:30:44 編輯:admin 文章來(lái)源: 點(diǎn)擊率:
在異常處理的時(shí)候,特別提醒兩點(diǎn):
一, 你的數(shù)據(jù)庫(kù)關(guān)閉的時(shí)候應(yīng)該是在代碼行0028前,而不是后;
二, 有人不習(xí)慣(或者一時(shí)疏忽)加上0088行的代碼;
針對(duì)[Sample-02]和[sample-03],把打開(kāi)數(shù)據(jù)庫(kù)連接寫(xiě)在所有的循環(huán)語(yǔ)句之前,如:
clsOraDb.Open(strConn)
Foreach(DataRow row in tabl.select(“”,”ProductID”)
……………
………….
Next
當(dāng)然還有另外一個(gè)做法,就是用Using語(yǔ)句,提交.NET應(yīng)用的垃圾收集器自動(dòng)收集;相關(guān)的文章很多,這里不再特別贅述。
二、對(duì)象只管創(chuàng)建應(yīng)用,不管釋放篇
我們繼續(xù)用[Sample-01]的代碼,我們現(xiàn)在看0004行的代碼:
0004 Dim dtResult As New DataTable
誰(shuí)會(huì)發(fā)現(xiàn)它被釋放,你不能,我也不能,從來(lái)沒(méi)有被釋放過(guò)。
“0004”行的代碼解釋是,要在內(nèi)存劃分一個(gè)空間給這個(gè)定義的對(duì)象dtresult;系統(tǒng)要?jiǎng)澐侄啻蟮目臻g呢?呀,我沒(méi)有研究過(guò)(留給那些有心人吧,呵呵..)。但有一點(diǎn),要在內(nèi)存劃分一個(gè)空間,就是要占用內(nèi)存。那么內(nèi)存有多大呢,不是無(wú)限大吧,也是有限的,所有運(yùn)行上述代碼的最終結(jié)果是,系統(tǒng)的執(zhí)行效率越來(lái)越慢,有人就懷疑,我有內(nèi)存1到2G的,加上虛擬內(nèi)存就更大,我只能說(shuō)你的懷疑沒(méi)錯(cuò)??墒悄愕膽?yīng)用程序就用這么一只函數(shù)嗎?我想肯定不是,所以上百只函數(shù)的應(yīng)用執(zhí)行對(duì)內(nèi)存的消耗可想而知。如果是后臺(tái)自動(dòng)運(yùn)行的程序,及時(shí)是一個(gè)function,也會(huì)讓系統(tǒng)崩潰。這只是一個(gè)簡(jiǎn)單的例子,有更復(fù)雜的。像這樣的對(duì)象應(yīng)用還有:Dataset, Datatable,DataReader,DataAdapter,Datagrid..等。
那么怎么解決這些問(wèn)題呢:
2.1在Try catch 語(yǔ)句前定義好所用的對(duì)象, 如:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
Catch ex As Exception
Throw ex
Finally
End Try
2.2釋放的語(yǔ)句如下
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
……………..
Catch ex As Exception
--釋放應(yīng)用的對(duì)象
Throw ex
Finally
--使用完后,釋放應(yīng)用的對(duì)象
dtResult.dispose --從內(nèi)存里清楚該對(duì)象
DR.dispose -從內(nèi)存里清楚該對(duì)象
DS.dispose -從內(nèi)存里清楚該對(duì)象
End Try
有人習(xí)慣寫(xiě)成下面這樣:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
‘使用完后,釋放應(yīng)用的對(duì)象
dtResult.dispose ‘從內(nèi)存里清楚該對(duì)象
DR.dispose ‘從內(nèi)存里清楚該對(duì)象
DS.dispose ‘從內(nèi)存里清楚該對(duì)象
Catch ex As Exception
‘釋放應(yīng)用的對(duì)象
Throw ex
Finally
End Try
這不是也釋放了嗎?我想問(wèn)的是,如果程序出現(xiàn)異常,它們會(huì)釋放嗎 ?我肯定得告訴大家,它們一定不能釋放,為了確保程序的穩(wěn)定運(yùn)行,我建議大家都來(lái)用Try Catch語(yǔ)句。
