EIMS系统的优化策略及其实现
2012-03-19杨薇王斌杨永国
杨薇 王斌 杨永国
1 .91550部队指控中心 辽宁 116023
2 .91550部队220所 辽宁 116023
0 引言
本文介绍了基于B/S模式的综合电子设备管理系统开发过程中使用的各种系统优化技术,这些优化技术的运用降低了网络延时、增强了服务器的并发处理能力,减少了重复的系统开销,提高了数据库的访问性能,使得系统的稳定性和高效性得以保证,对其它基于B/S模式的信息系统的优化具有一定的借鉴意义。
1 数据库访问优化
1.1 根据需要使用DataReader和DataSet
在实际系统开发过程中,是选用 DataReader还是DataSet,取决于以下几点:
(1) 内存消耗
DataReader和DataSet之间的主要区别是前者的内存开销要比后者更小。DataReader是一个一次只能访问单行记录信息的对象,不管结果集的大小,用DataReader来回移动该结果集时,一次只有单行记录加载到内存中;另一方面,DataSet是专门为内存缓存大量数据而设计的,DataSet要比DataReader耗费更多内存;因此在访问数据时,如果内存不是最需要考虑的问题时,可以使用 DataSet,否则应选用DataReader。
(2) 遍历方向
在一个数据库应用程序中传递数据时,必须考虑数据的遍历方向,可以根据数据遍历的方向要求来改善程序的性能。
如果以HTML形式通过ASP.NET页面显示结果集中的所有记录,可以使用DataReader,它专门用于在一个方向上快速读出和显示数据;当不需要在缓冲区中进行数据修改等操作,也不需要索引随机访问数据记录时,DataReader是一个更好的选择,它能提高程序的性能。
(3) 多个结果集
DataReader和DataSet都支持多个结果集的概念,但实现方式不同,DataReader通过NextResult方法来支持访问多个结果集,而DataSet将多个结果集加载到不同的DataTable对象中;使用DataSet时,可以访问其中不同的DataTable对象来访问返回的不同结果集,而用DataReader访问多个结果集时,只能进行向前、只读的操作。这意味着如果某个结果集先前已经被访问过,那么除非重置DataReader再从头显示,否则不能再访问该数据集。
综合以上的分析,在实际开发过程中,对于需要读取大量数据并且对返回数据不做大量处理时候,我们使用了DataReader;对于需要返回并处理大量数据的时候,我们使用了DataSet。而且,我们还发现,尽量不要对DataSet进行二次加工,特别是不要对 DataSet进行大量删除,因为这会很慢,不如复制部分数据。
1.2 使用存储过程
存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,客户执行存储过程时,只需调用服务器上的存储过程(有时传递存储过程所需的参数值)而不用发送整个 SQL语句。另外,存储过程在服务器端运行,独立于 ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。
在EIMS系统的开发过程中,在有规律地多次执行一条或多条相关的SQL语句和多客户有规律地执行包含SQL语句的批命令情况下,我们使用了存储过程来进行数据处理,当应用发生改变时,只需更改数据库服务器上的相关存储过程,使得系统调试、升级、维护都变得方便,提高了系统的灵活性。
1.3 数据库的连接与关闭
系统在访问数据库的时候需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对系统性能的影响。连接池(Connection Pool)是连接对象的集合体,是指拥有一定数量的连接对象的“缓冲存储池”。连接池内部提供一种管理机制,能控制连接池内部连接对象的个数、使用次数和时间,对应用程序提供获取和释放连接的接口。
建立连接池能显著地提高应用程序的性能和可伸缩性。连接池是根据每个惟一的连接字符串创建的,当创建一个池后,将按最小池大小的要求创建多个连接对象并将其添加到该池中。在请求连接时,将根据需要添加到池中,直至达到连接池上限。当达到上限且没有可用的连接,则该请求将会被排入等待队列。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求。
在EIMS系统的开发过程中,我们使用了以下方法发挥连接池的特性来提高系统性能。包括:在建立数据库连接后只有在真正需要操作时才打开连接,数据操作完成后立即显示地关闭数据库连接,以将其返回至池中,避免连接泄露;在关闭连接时删除临时对象;用不同的连接字符串以生成多个不同的连接池;在Web.Config中存储单个连接字符串;使用ConfigurationSettings.AppSettings,以在运行时采用编程形式对其进行访问。
1.4 优化查询语句
ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,在开发过程中,我们尽量使用优化过的SQL语句以减少执行时间,使用到的优化措施包括:尽量不在查询语句中包含子查询语句;在有Index的情况下,尽量保证查询使用了正确的Index;查询时使用匹配的类型,如在select * from a where id=9,如果这里ID是字符类型,同时有index,这条查询则使用不到Index,会做全表扫描,速度会很慢。正确的应该是 where id=”9”,加上引号表明类型是字符;使用—log-slow-querieslong-query-time=2查看查询比较慢的语句,然后使用explain分析查询,做出优化。
2 Cahce优化
大量的网站页面是采用动态的方式,根据用户提交的不同请求创建生成页面。动态页面有助于根据用户要求来提供定制的动态内容,动态页面也利于获取在数据库中每时每刻更新的资料,其缺点是为每个用户请求生成同一页面增加了系统开销。
ASP.NET提供了缓存技术有助于我们最大程度地解决这个问题。它能缓存输出的页面,保存在存储器当中,缓存用户请求的内容。缓存的特点可以根据不同方式来定制。ASP.NET 提供了一些简单的机制,它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外,通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域),可以优化这些页的性能。适当地使用缓存可以更好的提高站点的性能,有时这种提高是超数量级的。
在开发过程中,我们使用 ASP.NET 缓存机制时注意了以下两点。首先,尽量减少缓存的项,缓存每个项均有开销,特别是在内存使用方面;不缓存容易重新计算和很少使用的项,需要缓存的项包括:整个应用程序都要使用的设置或对象,经常被访问、并且变化不大的数据,如电子设备的基本信息等;其次,给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转,并且经常导致更多的代码清除和垃圾回收工作。
3 控件优化与选择
ASP.NET是一种事件驱动的和基于控件的编程模型,因此提供了大量的服务器控件可供使用。服务器控件就是在服务器端解析的控件,这些控件经过处理后会生成客户端呈现代码发送到客户端。服务器控件带来的方便和功能是html控件所不能比拟的,但是每一个服务器控件都需要在服务器端创建相应的对象,是以牺牲服务器端的资源为代价的,过多的使用服务器控件会极大影响程序性能。因此,在使用服务器控件的时候,我们采用了以下策略来减少对程序性能的影响:
(1) 减少不必要的服务器控件
有时使用html标记或数据绑定即能够实现所需功能,比如<asp:Label>控件,有时只用它来显示静态信息,此时就可以用简单的标记来实现。在html控件达不到所要实现的功能,而且其它脚本语言如 javascript、vbscript也不能实现的情况下,才考虑选择服务器控件。
(2) 禁用不必要的状态视图
服务器控件的 ViewState属性能够自动的在页面往返过程中维护服务器控件的状态,减少开发者的工作量,但是需要占用大量的服务器内存资源。因此,在不需要服务器控件状态视图的情况下,如在页面设计中经常使用的<asp:Lable>和<asp:Button>控件,应将其EnableViewState属性设置为false以减少不必要的资源占用。
(3) 合理使用DataGrid控件
DataGrid控件带有最强大的数据显示功能,还内置了对数据的修改、删除、添加、分页等很多功能。DataGrid控件的分页功能,数据的存储方式等虽然使用起来方便快捷,但是系统开销比较大。因此,在只需简单显示数据列表时,选择Repeater或DataList控件同样可以达到目的,而且减轻了性能上的开销。
4 结束语
基于 B/S模式的系统性能调整与优化是一个较大的话题,涉及的方面很多,如网络传输、并发处理、内容缓存、服务器缓存、数据库优化等。本文根据EIMS系统的开发实践,介绍了数据库访问优化,缓存管理,页面优化等优化策略的应用。由于系统本身的特点,使用到的优化策略有限,本文只对常规的优化技术进行了应用剖析。随着并发访问量的增大,反向代理缓存、Web负载均衡、数据库扩展、分布式计算等技术也将对优化系统性能起到重要的作用。
[1] Soumyasch,File:DotNEt.svg.2009.http://en.wikipedia.org/wiki/Fi le:DotNet.svg.
[2] 熊慧芳,陈莉.基于 ADO.NET的数据库访问技术研究[J].科技广场.2007.
[3] 李宗英.SQL存储过程在.NET数据库中的运用[J].信息科技.2008.
[4] 金灿,陈瑞君等.NET框架中三种数据库访问技术及效率比较[J].计算机应用研究.2003.
[5] 刘志波.NET中统一的存储过程调用方法[J].计算机应用.2003.
[6] 谢招犇,李卫华.数据库连接池模型的分析与优化[J].现代计算机.2006.