在線客服
24小時(shí)免費(fèi)咨詢電話: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)擊率:
在運(yùn)用Visiol studio.NET 開(kāi)發(fā)Web 應(yīng)用程式中,開(kāi)發(fā)者常常會(huì)遇到一些問(wèn)題:如我開(kāi)發(fā)好的程式,在開(kāi)發(fā)環(huán)境下測(cè)試沒(méi)問(wèn)題,怎么一搬到應(yīng)用環(huán)境下,就會(huì)有問(wèn)題? 不是程式的無(wú)法運(yùn)行,就是程式的效率慢的同蝸牛在爬, 這種情況在.NET的新手中尤其常見(jiàn)。我不知道為什么,一些介紹.NET開(kāi)發(fā)的書(shū)本里引用的例子代碼,也對(duì)此問(wèn)題視而不見(jiàn),尤其讓我郁悶的是一些我喜歡的書(shū),如:<<ADO.NET技術(shù)內(nèi)幕>>,<<ASP.NET2.0高級(jí)編程(第4版 )>>,這兩本都是清華大學(xué)出版社出版的, 有一本書(shū)更糟糕<<Visual Basic.Net 專業(yè)項(xiàng)目實(shí)例開(kāi)發(fā)>>,我建議大家還是不要看了吧,免的浪費(fèi)時(shí)間和精力。
這篇文章不僅對(duì).NET開(kāi)發(fā)者的新手有幫助,同樣對(duì)哪些有經(jīng)驗(yàn),也帶來(lái)一些啟示和參考。
他們會(huì)遇到什么樣的問(wèn)題,我不妨總結(jié)給大家:
1. 數(shù)據(jù)庫(kù)連接超時(shí)
2. 創(chuàng)建的對(duì)象只管用,不管釋放
3. 調(diào)試(Debug)模式下編譯后,就用于應(yīng)用環(huán)境中了
4. 實(shí)際作業(yè)模式分享
上面的問(wèn)題就像毒瘤,積累到一定程度就爆發(fā),且影響深遠(yuǎn)。
一、數(shù)據(jù)庫(kù)連接超時(shí)篇
若要知道數(shù)據(jù)庫(kù)連接超時(shí)問(wèn)題,先看下面一段代碼:
[Sample-01]:
Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResult
0001 Dim clsResult As New BSResult
0002 Try
0003 clsResult.ResultID = -1
0004 Dim dtResult As New DataTable
0005 Dim Sql As String = String.Empty
0006 Dim clsOraDb As New clsOraClienDb
0007 Dim strConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
0008 clsOraDb.Open(strConn) ‘這里Open后,后面看不到 clsOraDb.Close
0009 Sql = "SELECT SATBMMBRND.OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND.MATNO = :MATNO"
0010 Dim params() As OracleParameter = {New OracleParameter("MATNO", psPN)}
0011 If clsOraDb.FillDataTable(Sql, dtResult, params) = False Then
0012 Return clsResult
0013 End If
0014 If dtResult Is Nothing Then
0015 Return clsResult
0016 End If
0017 If dtResult.Rows.Count > 0 Then
0018 OEMPN = dtResult.Rows(0)("FRUNO").ToString()
0019 Else
0020 OEMPN = ""
0021 End If
0022 clsResult.ResultID = 1
0023 Return clsResult
0024 Catch ex As Exception
0025 clsResult.ResultID = -1
0026 Return clsResult
0027 End Try
End Function
對(duì)上述代碼行的部分解釋:
0006:引用數(shù)據(jù)庫(kù)連接的類;
0008:打開(kāi)數(shù)據(jù)庫(kù)連接;
然后,整個(gè)函數(shù)你再找不到關(guān)閉數(shù)據(jù)庫(kù)連接的動(dòng)作,是要等著操作系統(tǒng)來(lái)釋放嗎? 有人就說(shuō)啦,看起來(lái)好像沒(méi)有什么大不了的,這僅僅是一個(gè)函數(shù)而已;數(shù)據(jù)庫(kù)打開(kāi)連接,未關(guān)閉不會(huì)影響到整個(gè)應(yīng)用程式;果真是這樣嗎?
讓我們談?wù)剶?shù)據(jù)庫(kù)連接的問(wèn)題,在Oracle數(shù)據(jù)庫(kù)里,一般默認(rèn)的數(shù)據(jù)庫(kù)連接數(shù)最多也就100多來(lái)個(gè),不會(huì)超過(guò)200個(gè),即使你改變這個(gè)連接數(shù),但無(wú)論怎樣,它的連接數(shù)是有限的,不可能無(wú)限地供你消耗。
在Web這個(gè)程式里,它不僅不會(huì)自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接,象這樣的函數(shù)還會(huì)每次調(diào)用,都會(huì)重新用掉一個(gè)數(shù)據(jù)庫(kù)連接;如果象這樣的函數(shù)很多的話,你就等著一個(gè)錯(cuò)誤警告頁(yè)面彈出來(lái),如Database Connection Timeout….等訊息。
這還不算什么,更有甚者,盡然在循環(huán)語(yǔ)句里寫(xiě)下面的代碼如 :





