来源:中国计算机报
asp是一个web服务器端的开发环境,它提供了一种简单易学的脚本(vbscript或jscript),并带有许多内置的对象,从而提供了一条简捷的编程之路。 更为重要的是,asp中提供了ado对象,让程序员可以轻松操作各种数据库,从而可以产生和运行动态的、交互的web服务应用程序。
目前,国内很多电子商务站点都采用了asp技术来与数据库交互,为用户提供各类服务。
由于电子商务站点的大部分信息都存放在数据库中,要提高web的响应速度、建立高性能的电子商务站点,很大一部分取决于asp与数据库之间的处理性能,本文将具体介绍一些优化数据库处理的方法。
使用connection pool机制
在数据库处理中,资源花销最大的是建立数据库连接,而且用户还会有一个较长的连接等待时间。若每一个用户访问时,都重新建立连接,不仅用户要长时间等待,而且系统有可能会由于资源消耗过大而停止响应。如果能够重用以前建立的数据库连接,而不是每次访问时都重新建立连接,则可以很好地解决这些问题,从而提高整个系统的性能。在iis+asp处理体系中,采用了connection pool机制来保证这一点。
connection pool的原理是:iis+asp体系中维持了一个连接缓冲池,建立好的数据库连接在asp程序中的断开都是逻辑断开,而实际的物理连接被存储在池中并被加以维护。这样,当下一个用户访问时,直接从连接缓冲池中取得一个数据库连接,而不需重新连接数据库,因此,可以大大地提高系统的响应速度。
为了正确使用connection pool机制,必须注意以下几点:
1. 在mdac2.0以前的版本中,必须经过数据库驱动程序的配置才能使用connection pool;在以后的版本中(比如mdac2.1),缺省是使用connection pool机制。具体配置情况可以参见微软公司的站点(http://www.microsoft.com/data/)。
顺便提一句,在使用oracle数据库时,最好使用微软提供的驱动程序。
2. 每次数据库连接串参数必须相同,否则会被认为是不同的连接而重新去连接数据库,而不是使用缓冲池中的连接。最好的做法是将连接串存储在application变量中,所有的程序在建立连接时使用application变量的值。
3. 为了更好地使用和维护连接缓冲池,建议在程序中使用以下的方法对数据库连接进行操作,因为隐式使用数据库连接时不能利用缓冲池的机制:
显式创建连接对象: set conn=server.createobject(“adodb.connection”)
建立数据库连接:conn.open application(“connection_string”)
显式关闭连接对象:conn.close
利用直接的ole db驱动程序
在asp中,通过ado可以使用两种方式连接数据库,一种是传统的odbc方式,一种是ole db方式。由于ado是建立在ole db技术上的,为了支持odbc,必须建立相应的ole db 到odbc的调用转换(如ms oledb provider for odbc)。而使用直接的ole db方式(如ms oledb provider for sql, oracle),则不需转换,从而提高处理速度,同时,还能利用ole db的新特性。
在内存中缓存ado对象或其内容
通常,在asp程序中,都会涉及到一些存储在数据库中的常用信息,如省份列表、商品分类等,这些信息对于每一个访问用户都是相同的。若每一个用户访问时,都要去数据库里取出来,然后显示给用户,不仅会使数据库服务器负载加重,无法快速服务于更重要的事务处理,而且web服务器也必须不停地创建ado对象,从而消耗大量资源,导致了当用户很多时几乎失去响应。若能把一些常用信息事先存储在内存中,当用户访问时,直接从内存中取出,显示给用户,则可以大大减小系统的压力,提高响应速度。
比如,我们可以把已经取得了数据的recordset对象存储在application变量中,当用户访问时,从application变量中取得recordset对象,而不需再次建立数据库连接;也可以将recordset对象里的数据以其他方式存储,比如存储在数组中,然后再将数组存储在application变量中,使用时用数组的方式读取。
需要注意的是,一个对象要存储在application变量中,线程模式必须是both;对于不满足该条件的对象,必须以其他方式,比如转换成数组的方式存储在application变量中,这也是上面所说的将内容存储在数组中的原因。
使用数字序列
在asp程序中,从诸如recordset中读取数据时,为了方便,常使用数据库列名的方式进行:
response.write rs(“fieldnamen”)
而很少采用该数据库列名所在的数字序列来读取,即:
response.write rs(n)
其实,为了从recordset得到列值,ado必须将列名转化为数字序列,因此,若直接使用数字序列,则可以提高读取速度。若感觉使用数字序列后,程序可读性不直观,可以采用建立常量的方法,如定义:
const fieldname1 1
这样就保证了程序的可读性和读取速度。
使用数据库过程
在电子商务站点中,尤其是要进行交易的站点,为了完成交易,可能需要多次查询大量的信息,用于判定是非,然后更新入库。若在编写asp时,直接在一个程序中作多次数据库操作,不仅iis要创建很多的ado对象,消耗大量资源,而且加重了数据库服务器的负担,增大了网络流量。若把多次数据库操作流程定义为一个数据库过程,用如下方式调用:
connection.execute “{call procedurename(..)}”
这样可以利用数据库的强大性能,大大减轻web系统的压力,而且由于页面内容与业务分开,管理维护也变得方便。
利用数据库的特性
ado是一套通用的对象控件,本身没有利用数据库的任何特性。但若在asp程序编写时,有意识地考虑结合数据库的特性,往往可以有很好的效果。
比如,oracle数据库服务器对于执行过的sql语句,通常都经过了分析优化,并存储在一个sql内存缓冲区中,当下次同样的sql语句请求时,直接从内存缓冲区取出执行,不再进行分析优化,从而可以大幅度提高性能。这就要求在asp程序编写时,尽量使用相同的sql语句,或者参数化的sql语句:
set cmd=server.createobject(“adodb.command”)
cmd.commandtext=”select * from product where productcode=?”
用时创建用完释放
在前面也提到过,ado对象是非常消耗资源的,因此一定要牢牢记住,只在用到ado对象时才创建,用完后马上释放,程序如下:
set rs=server.createobject(“adodb.recordset”)
….
rs.close
set rs=nothing
使用优化过的sql语句
对于电子商务网站,最主要的就是要保证不论访问用户的多少,系统都要有足够快的响应速度。由于在asp技术中,ado对象消耗的资源是非常大的,若一个sql语句要执行很长的一段时间,对整个资源也将一直占用,使系统没有足够的资源服务于其它用户。因此,尽量使用优化过的sql语句,减少执行时间。比如,不使用在in语句中包含子查询的语句,充分利用索引。
只要在我们的电子商务网站的建设中充分考虑到效率问题,并利用上述介绍的解决方法,会极大地提高网站的响应速度。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器