|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那做企业软件是不是最好用J2EE?在使用Visiolstudio.NET开辟Web使用程式中,开辟者经常会碰到一些成绩:如我开辟好的程式,在开辟情况下测试没成绩,怎样一搬到使用情况下,就会有成绩?在使用Visiolstudio.NET开辟Web使用程式中,开辟者经常会碰到一些成绩:如我开辟好的程式,在开辟情况下测试没成绩,怎样一搬到使用情况下,就会有成绩?不是程式的没法运转,就是程式的效力慢的同蜗牛在爬,这类情形在.NET的老手中特别罕见。我不晓得为何,一些先容.NET开辟的书籍里援用的例子代码,也对此成绩置若罔闻,特别让我忧郁的是一些我喜好的书,如:<<ADO.NET手艺内情>>,<<ASP.NET2.0初级编程(第4版)>>,这两本都是清华年夜学出书社出书的,有一本书更糟<<VisualBasic.Net专业项目实例开辟>>,我倡议人人仍是不要看了吧,免的华侈工夫和精神。
这篇文章不但对.NET开辟者的老手有匡助,一样对哪些有履历,也带来一些启发和参考。
他们会碰到甚么样的成绩,我无妨总结给人人:
1.数据库毗连超时
2.创立的工具尽管用,不论开释
3.调试(Debug)形式下编译后,就用于使用情况中了
4.实践功课形式分享
下面的成绩就像毒瘤,堆集到必定水平就发作,且影响深远。
1、数据库毗连超时篇
若要晓得数据库毗连超时成绩,先看上面一段代码:
[Sample-01]:
PublicSharedFunctiongetOEMPN(ByValpsPNAsString,ByRefOEMPNAsString)AsBSResult
0001DimclsResultAsNewBSResult
0002Try
0003clsResult.ResultID=-1
0004DimdtResultAsNewDataTable
0005DimSqlAsString=String.Empty
0006DimclsOraDbAsNewclsOraClienDb
0007DimstrConnAsString=ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
0008clsOraDb.Open(strConn)‘这里Open后,前面看不到clsOraDb.Close
0009Sql="SELECTSATBMMBRND.OEMPNFRUNOFROMSATBMMBRNDWHERESATBMMBRND.MATNO=:MATNO"
0010Dimparams()AsOracleParameter={NewOracleParameter("MATNO",psPN)}
0011IfclsOraDb.FillDataTable(Sql,dtResult,params)=FalseThen
0012ReturnclsResult
0013EndIf
0014IfdtResultIsNothingThen
0015ReturnclsResult
0016EndIf
0017IfdtResult.Rows.Count>0Then
0018OEMPN=dtResult.Rows(0)("FRUNO").ToString()
0019Else
0020OEMPN=""
0021EndIf
0022clsResult.ResultID=1
0023ReturnclsResult
0024CatchexAsException
0025clsResult.ResultID=-1
0026ReturnclsResult
0027EndTry
EndFunction
对上述代码行的部分化释:
0006:援用数据库毗连的类;
0008:翻开数据库毗连;
然后,全部函数你再找不到封闭数据库毗连的举措,是要等着操纵体系来开释吗?有人就说啦,看起来仿佛没有甚么年夜不了的,这仅仅是一个函数罢了;数据库翻开毗连,未封闭不会影响到全部使用程式;果然是如许吗?
让我们谈谈数据库毗连的成绩,在Oracle数据库里,一样平常默许的数据库毗连数最多也就100多来个,不会凌驾200个,即便你改动这个毗连数,但不管如何,它的毗连数是无限的,不成能无穷地供你损耗。
在Web这个程式里,它不但不会主动封闭数据库毗连,象如许的函数还会每次挪用,城市从头用失落一个数据库毗连;假如象如许的函数良多的话,你就等着一个毛病告诫页面弹出来,如DatabaseConnectionTimeout….等讯息。
这还不算甚么,更有甚者,尽然在轮回语句里写上面的代码如:
[Sample-02]
Foreach(DataRowrowintabl.select(“”,”ProductID”)
……………
clsOraDb.Open(strConn)
………….
Next
有人还喜好玩上面的语句:
[Sample-03]
Foreach(DataRowrowintabl.select(“”,”ProductID”)
Foreach(DataColumncolintbl.columns)
……………
clsOraDb.Open(strConn)
Next
………….
Next
说到这,有人就问啦,我在开辟情况下测试一点成绩都没有呀?是呀,你是没有成绩,我想问的是,你开辟情况的测试数占有几笔?
如今,成绩已晓得在那里,怎样办理?
针对[sample-01]做以下处置,注重上面代码:
PublicSharedFunctiongetOEMPN(ByValpsPNAsString,ByRefOEMPNAsString)AsBSResult
0001DimclsResultAsNewBSResult
0002Try
0003clsResult.ResultID=-1
0004DimdtResultAsNewDataTable
0005DimSqlAsString=String.Empty
0006DimclsOraDbAsNewclsOraClienDb
0007DimstrConnAsString=ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
0008clsOraDb.Open(strConn)正文:这里Open后,前面看不到clsOraDb.Close
0009Sql="SELECTSATBMMBRND.OEMPNFRUNOFROMSATBMMBRNDWHERESATBMMBRND.MATNO=:MATNO"
0010Dimparams()AsOracleParameter={NewOracleParameter("MATNO",psPN)}
0011IfclsOraDb.FillDataTable(Sql,dtResult,params)=FalseThen
0012ReturnclsResult
0013EndIf
0014IfdtResultIsNothingThen
0015ReturnclsResult
0016EndIf
0017IfdtResult.Rows.Count>0Then
0018OEMPN=dtResult.Rows(0)("FRUNO").ToString()
0019Else
0020OEMPN=""
0021EndIf
0022clsResult.ResultID=1
0088clsOraDb.Close正文:前面看到clsOraDb.Close
0023ReturnclsResult
0024CatchexAsException
0099clsOraDb.Close正文:程序非常也看到clsOraDb.Close
0025clsResult.ResultID=-1
0026ReturnclsResult
0028Throwex
0027EndTry
EndFunction
注重下面的两句代码:0088行和0099行。
在非常处置的时分,出格提示两点:
一,你的数据库封闭的时分应当是在代码行0028前,而不是后;
二,有人不习气(大概一时忽略)加上0088行的代码;
针对[Sample-02]和[sample-03],把翻开数据库毗连写在一切的轮回语句之前,如:
clsOraDb.Open(strConn)
Foreach(DataRowrowintabl.select(“”,”ProductID”)
……………
………….
Next
固然另有别的一个做法,就是用Using语句,提交.NET使用的渣滓搜集器主动搜集;相干的文章良多,这里不再出格赘述。
2、工具尽管创立使用,不论开释篇
我们持续用[Sample-01]的代码,我们如今看0004行的代码:
0004DimdtResultAsNewDataTable
谁会发明它被开释,你不克不及,我也不克不及,历来没有被开释过。
“0004”行的代码注释是,要在内存分别一个空间给这个界说的工具dtresult;体系要分别多年夜的空间呢?呀,我没有研讨过(留给那些故意人吧,呵呵..)。但有一点,要在内存分别一个空间,就是要占用内存。那末内存有多年夜呢,不是无穷年夜吧,也是无限的,一切运转上述代码的终极了局是,体系的实行效力愈来愈慢,有人就嫌疑,我有内存1到2G的,加上假造内存就更年夜,我只能说你的嫌疑没错。但是你的使用程序就用这么一只函数吗?我想一定不是,以是上百只函数的使用实行对内存的损耗不可思议。假如是背景主动运转的程序,实时是一个function,也会让体系溃散。这只是一个复杂的例子,有更庞大的。像如许的工具使用另有:Dataset,Datatable,DataReader,DataAdapter,Datagrid..等。
那末怎样办理这些成绩呢:
2.1在Trycatch语句前界说好所用的工具,如:
DimdtResultAsNewDataTable
DimDRasNewDataReader
DimDSasNewDataset
Try
..
CatchexAsException
Throwex
Finally
EndTry
2.2开释的语句以下
DimdtResultAsNewDataTable
DimDRasNewDataReader
DimDSasNewDataset
Try
..
……………..
CatchexAsException
--开释使用的工具
Throwex
Finally
--利用完后,开释使用的工具
dtResult.dispose--从内存里分明该工具
DR.dispose-从内存里分明该工具
DS.dispose-从内存里分明该工具
EndTry
有人习气写成上面如许:
DimdtResultAsNewDataTable
DimDRasNewDataReader
DimDSasNewDataset
Try
..
‘利用完后,开释使用的工具
dtResult.dispose‘从内存里分明该工具
DR.dispose‘从内存里分明该工具
DS.dispose‘从内存里分明该工具
CatchexAsException
‘开释使用的工具
Throwex
Finally
EndTry
这不是也开释了吗?我想问的是,假如程序呈现非常,它们会开释吗?我一定得告知人人,它们必定不克不及开释,为了确保程序的不乱运转,我倡议人人都来用TryCatch语句。
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|