|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
大家可以自己去看一看.可以说看得想呕吐.以前有次下了个动网来看.里面连基本内置函数的保护措施(函数没防御性)都没有.难怪经常补这个补那个了.可能现在.NET版会好点吧ado|功能 1、概述
“功能”这一术语有着几种分歧的、差别奇妙的寄义。当人们谈到某个器材功能几何好时,他们想要表达的意思能够就是在必定的工夫以内它完成了几何任务。例如,一特性能好的动员机运转起来更不乱,发生的动力更壮大。关于开辟小组,你一样也能够使用这个判别尺度:一特性能好的开辟小组任务时对照宁静,并且可以临盆出大批高质量的代码。对我来讲,功能最少意味着两件工作――我的代码运转起来有多好,我的开辟小组和我自己任务效力怎样。不管哪一方面,本文引见的技能都将起到必定的匡助感化:匡助你更快地编写代码,匡助你编写更快的代码――宁静地完成这一切,削减如许那样的毛病。本文引见的技能次要面向ADO,出格是若何经由过程ADO会见SQL Server。但与此同时,我还将触及一些合用局限更广的COM技能,它们合用于你所编写的一切Visual Basic代码。
为了懂得从哪些SQL Server数据会见代码编写手艺、哪些系统、哪些开辟习气可以失掉最好的功能,我已花了很多工夫。一些情形下,关于使用的全体功能来讲,单一的手艺意义很小,除非咱们经由过程轮回将功能的改良水平成倍缩小。例如,在一个客户机/办事器使用中,当咱们不是经由过程指定ODBC数据源(DSN)的体例毗连数据库时,大约可以节俭一到二秒的工夫。关于使用全体的合用性或功能来讲,这局部节俭的工夫所发生的影响很小。然而,假如咱们在一个两头层组件上使用这类手艺,这个组件每分钟(或每小时,天天)都要创立和封闭数据库毗连数百(乃至数千)次,那末,这类手艺将明显地影响体系的功能体现。因而,关于我在这里会商的每种手艺,请务必思索这个倍数因子――即,在必定的工夫周期内,你的体系将履行统一段代码几何次。
当你入手下手追求改善功能的计划时,请思索一下你的使用(组件,或是ASP代码)大部分的守候和处置工夫花在甚么中央。假如你发明使用法式把大批的工夫花在守候Open或Execute办法履行完成,那末,你应当仔细地反省一下办事器真个查询战略。包含ADO在内,一切的数据会见接口守候查询了局的工夫都不异。例如,假如你有一个查询,SQL Server需求20秒才干完成它,不管用来履行该查询的是甚么接口,没有一种接口可以比其他接口以更快的速度前往了局。固然有些接口翻开毗连的速度对照快,有些接口处置了局集的速度对照快,但没有一种接口可以影响数据库引擎编译和履行查询的速度。因而,假如你的查询具有太高的“应战性”――例如你没有对索引停止优化,你没有利用存储进程,办事器负载太重,或你请求前往的纪录数目太多――那末,世界上没有一种ADO手艺可以匡助你进步功能。除非你处理了这些根基的查扣问题,不然没有一种功能调剂手艺可以明显地改良全体功能。SQL Server的Query Analyzer是一个剖析查询功能的优异东西。它可以用图形的体例显示查询的履行进程,并对改善功能的办法提出建议。
假如你可以确信查询具有较高的效力,那末,你可使用本文引见的手艺进一步伐整ADO代码的功能。这里引见的技能将从各个方面匡助你简化和改善ADO编程,包含:创立和保护毗连,机关和提交履行速度更快的查询,进步处置查询了局的效力,等等。
2、创立毗连
在一个客户机/办事器使用中,咱们可以用好几种办法把创立和初始化数据库毗连所需求的工夫埋没起来,使得使用法式既可以翻开毗连,又不需求用户守候使用法式启动。起首,咱们可以测验考试异步毗连。利用异步毗连时,ADO启动毗连操作以后,不守候毗连完成绩把掌握权前往给使用法式――如许,使用法式就可以够接着履行大部分初始化操作,以更快的速度完成form_load事务处置。假如封闭偏重新创立毗连的工夫小于毗连池释放毗连的工夫,那末这个毗连实践上是即时的。但在很多情形下(出格是用户数目不多时),让毗连坚持翻开形态更具有实际意义。在两头层组件或ASP页面外部,假如数据库查询屡次反复呈现,我建议你让Connection对象坚持翻开形态。
别的一个改善毗连功能的举措是,防止利用带有DSN的ODBC。在Microsoft,ODBC已转入了Quick Fix Engineering(QFE,疾速修缮工程)形态,它意味着:除非发明严重BUG,该公司将不再在ODBC或它的驱动法式上花工夫。别的,思索功能和安排成绩时,ODBC DSN也是一个必需存眷的成绩。DSN必需装置到客户体系上,请求停止注册表查找,与OLE DB毗连比拟,它创立毗连所需求的工夫更长――出格是当你用直接编码的体例指定ConnectionString时,这一点特别凸起。从实践后果来看,防止利用DSN下降的体系开支很无限:假如完整作废毗连创立进程,关于每一个毗连,你或许可以剩下二到五秒工夫(假定数据库毗连池中已没有毗连)。但是,假如你的使用法式需求频仍地创立毗连,节俭的工夫累计起来就很可不雅了。
创立数据库毗连的时分,你要选择一个数据供应者。Microsoft建议咱们利用OLE DB供应者替换默许的ODBC供应者。对照最新的OLE DB当地供应者和功效相似但较早的ODBC供应者,我感应前者使人不兴奋的不测之事较少。但不管是哪一种情形,你都应当在决意利用某个新的供应者之前对使用停止完全地测试――代码的功能、撑持的功效、行动体例都有能够产生变更。
在两头层和ASP中,在坚持毗连翻开的情形下,咱们不克不及(从理论来看)创立出可伸缩的组件――最少在屡次挪用之间是如许的。普通地,当IIS援用和释放组件、ASP页面的实例时,组件和ASP页面被频仍地装入、抛弃。因为基于ADO的代码每次履行时都必需创立、利用、释放数据库毗连,最小化毗连庞杂水平的战略对功能的进步水平到达了可分明丈量的水平。在这些情况下,关于咱们毗连数据库的速度来讲,毗连/会话池有侧重要的意义。假如你为Command对象的ConnectionString属性指定适合的值(即,每次利用一样的办事器、初始目次、登录ID和其他参数),那末,毗连已翻开且处于可用形态的时机很大。假如毗连池中可以找到婚配的毗连,毗连(或从头毗连)的工夫将接近0(凡是小于250 ms)。
但是,假如ADO(或VB)代码不释放Connection对象,或,咱们在分歧的实例之间更换了ConnectionString,OLE DB必需每次创立一个新的毗连。假如呈现了这类情形,咱们将很快耗尽毗连池内可用毗连的数目。要确保毗连被释放,咱们必需在封闭毗连以后把Connection对象设置为Nothing。别的,不要在Recordset Open办法中利用ConnectionString,而是以自力的体例翻开Connection对象;如许,当咱们要封闭Connection对象和要把它设置成Nothing的时分,援用它就很便利了。
3、机关和提交查询
在机关查询的时分,要弄清晰为何必需这么做、为何不克不及那末做是一个很庞杂的成绩。但是,一些根基的指点方针可以让机关高效查询的进程加倍流利、轻松。普通地,你不该该让查询华侈办事器工夫。上面几个技能可以匡助你机关出更好、更高效的查询。
不要强迫SQL Server每次履行查询的时分从头编译和机关查询履行企图。防止这类反复操作的一种复杂办法是利用带有参数的存储进程。注重尽可能不要利用ADO Command对象的Prepare属性――有时它不克不及准确任务。假如利用存储进程,你还可以经由过程消弭不用要的“受影响行数”前往值进一步进步ADO功能――只需在存储过程当中到场SET NOCOUNT ON就能够了。
尽可能削减与办事器的通讯次数。假如你有几个相干的操作要履行,请把它们兼并为一个存储进程,或是一个可以在办事器上作为剧本履行的复合查询。防止利用办法(好比Refresh)和不恰当的Parameters纠合援用,它们会强迫ADO增添额定的办事器通讯进程。
在客户机/办事器使用中,只机关Command对象一次,而不是每次利用Command对象的时分从头机关。你可以从头设置Command的参数值,然后在需求时履行它。
当查询前往的不是一个纪录集时,确保利用了adExecuteNoRecords选项,告知ADO超出一切那些用来吸收和机关纪录集(Recordset格局)的代码。你可以把adExecuteNoRecords选项传递给Execute办法,或把它作为Command的选项。
履行前往复杂纪录集的存储进程时,不要利用Command对象。一切的存储进程(和Command对象)可以作为Connection对象的COM办法呈现。让存储进程作为Connection对象的办法呈现有着明显的功能优势,同时它也简化了代码。虽然这类手艺关于那些有Return Status值或Output参数的存储进程没有甚么匡助,但关于举措查询(INSERT、DELETE等)和那些前往一个或多个纪录的查询来讲,这类手艺很有效。把存储进程作为Connection的办法以后,你可以用办法参数的模式传入存储进程的输出参数;假如挪用存储进程前往了一个纪录集,你可以经由过程办法挪用中最初一个参数援用该Recordset。例如,上面的ADO语句履行一个名为“Fred”的存储进程,Fred存储进程有两个输出参数,前往一个Recordset:
MyConnection.Fred "InputArg1", 2, myRecordset
编写代码的时分,不要寄但愿于VB的主动完胜利能会把存储进程或Command对象名字视为正当的Connection对象的办法。在正式运转之前,COM不会解析这类名字。
除非相对需要,不然不要前往纪录集。当正在履行的查询前往纪录时,ADO就会机关一个Recordset对象。机关Recordset对象的开支很大,因而你应当尽可能防止利用Recordset对象。注重有时分履行查询固然前往了局,但不是前往纪录。例如,你可以经由过程Return Status参数前往整数值。别的,你可以前往Output参数来替换需求机关Recordset对象的纪录集,SQL Server答应前往的Output参数多达1000个。
只需有能够,请用举措查询(INSERT,UPDATE,DELETE和履行这些操作的存储进程)替换可更新的Recordset游标。此时,你应当利用Execute办法和它的adExecuteNoRecords选项,确保ADO可以晓得查询不需求机关Recordset对象。
除非需要,不然不要恳求办事器停止排序。大多半情形下,关于一个过度巨细的Recordset对象,当它被发送到客户端以后,排序速度将更快。别的,假如让ADO客户法式排序Recordset中的纪录,则客户使用法式可以依照用户选择的次第排序,从而进步了天真性。
在编写查询之前懂得索引的布局。创立适合的索引,调剂查询的语法以使用这些索引,你将可以进步纪录提取的速度。Query Analyzer可以匡助你决意是不是有需要添加更多的索引。
不要一次性前往太多的纪录。良多时分,容量太大的纪录会议严重地影呼应用法式的功能。只前往那些以后你需求的纪录,假如客户法式需求更多的纪录</p> ASP一般认为只能运行在IIS上,正如前面所提到的,这并不是十分正确,事实上,ASP也能运行在Apache上。Apache ASP可在任意Apache服务器上运行有限的ASP功能,所需做的,只需打开mod_perl。 |
|