使用 page 作用域对象
通过“Server.CreateObject”或 HTML 标签在 ASP 页上创建的对象在整个页面的期间都存在。该页上的任何脚本命令都可以访问此对象,并且当 ASP 完成该页处理时释放此对象。因此对象具有 page 作用域或生存期。
在循环中创建对象
通常,应避免在循环中创建对象。如果必须在循环中创建对象,则需要手工释放该对象使用的资源:
Dim objAd
For i = 0 To 1000
Set objAd = Server.CreateObject("MSWC.AdRotator")
.
.
.
objAd.GetAdvertisement
.
.
.
Set objAd = Nothing
Next
%>
提供对象 Session 作用域
session-scope 对象是为应用程序中的每个新会话创建的,并且在会话结束后释放;因此,每个活动会话都有一个对象。Session 作用域用于那些由多个脚本调用但只影响一个用户会话的对象。只应在必要时提供对象 Session 作用域。如果使用 Session 作用域,则必须知道提供对象的组件的线程模型,这是因为线程模型影响对象的性能和安全环境。详细信息,请参阅本主题中的高级信息:性能问题。
要提供对象 Session 作用域,可将对象存储在 ASP 的 Session 内建对象中。可以通过在 Global.asa 文件中使用 HTML 标签或在 ASP 页中使用 Server.CreateObject 方法来创建 Session 作用域对象例程。
在 Global.asa 文件中,可以使用 标签,并扩展 RUNAT 属性(必须设置为 SERVER)和 SCOPE 属性(必须设置为 Session)。下面的例子将创建“浏览器能力”组件的 Browser Type 对象的 Session 作用域实例:
当对象已经存储在 Session 对象中后,即可从应用程序的任何页访问该对象。下面语句使用在前例中通过 标签创建的对象实例:
= 4 Then . . .%>
在 ASP 页中,也可以使用 Server.CreateObject 方法将对象存储到 Session 内建的对象中。下面的示例将 Browser Type 对象的一个实例存储到 Session 对象中。
要在其他 .asp 文件中显示浏览器信息,必须首先检索 Session 对象中存储的 BrowserType 对象的实例,然后调用 Browser 方法来显示浏览器名称。
对于通过 标签声明的对象,在 .asp 文件脚本命令参照该对象之前 ASP 不会对其实例化。Server.CreateObject 方法可立即实例化对象。因此,对于 Session 作用域对象来说, 标签可以比 Server.CreateObject 方法提供更好的伸缩性。
提供对象 Application 作用域
application-scope 对象是应用程序启动时创建的对象的单个实例。所有客户端请求都可以共享此对象。某些实用程序对象,如页面计数器组件的对象,可能更适合于在 application 作用域内执行,但通常需要使用下节中建议的其他方式。另外,线程模型会影响对象的性能和安全环境(请参阅本主题中的高级信息:性能问题)。
要提供对象 application 作用域,可将对象存储在 ASP 的 Application 内建的对象中。可以通过使用 Global.asa 文件中的 标签或使用 .asp 文件中的 Server.CreateObject 方法来创建 application 作用域对象实例。
在 Global.asa 文件中,可以使用 标签,并扩展 RUNAT 属性(必须设置为 Server)和 SCOPE 属性(必须设置为 Application)。例如,下面的示例使用 标签来创建 Ad Rotator 对象的 作用域实例:
以 Application 状态存储 Ad Rotator 对象后,即可使用如下所示语句从应用程序的任何页中访问该对象:
另外,在 .asp 文件中,可以使用 Server.CreateObject 将对象实例存储到 Application 内建的对象中,如下例所示:
可以通过检索 Application 状态中 Ad Rotator 对象的实例来显示应用程序 .asp 文件中的公布,如下例所示:
Session 和 Application 作用域的替代方案
通常,对于那些初始化时间很长的项目或对象,如字典对象或记录集,应尽可能地使用Session 和 Application 作用域。不过,如果 session 或 application 状态的对象占用太多的资源,如内存或数据库连接,则应寻求其他方案来实施这些对象。例如,组件的线程模型会影响从该组件创建的对象性能,尤其是具有 Session 和 Application 作用域的对象的性能。
在许多情况下,比创建 Session 或 Application 作用域对象更好的方案就是使用 Session 或 Application 作用域变量,这些变量可以将信息传递给在页面级创建的对象。例如,不应对 ADO 的 Connection 对象提供 Session 或 Application 作用域,因为该对象创建的连接会长时间保持打开状态,而且脚本不再利用连接池。不过,可以在“Session”或“Application”内建的对象中存储 ODBC 或 OLE DB 连接字符串,并访问该字符串以便为在页面上创建的“Connection”对象实例设置属性。这样,可以将经常使用的信息存储为 session 或 application 状态,而且只在需要时才创建使用该信息的对象。关于作用域变量的详细信息,请参阅使用变量和常量。
用户定义的 JScript 对象
可以创建自己的 JScript 对象,方法是定义一个用来创建和初始化新对象属性和方法的构造器函数。当脚本使用“new”操作符来调用构造器时,将创建对象实例。ASP 服务器端脚本支持用户定义的 JScript 对象,并且当具有 page 作用域时这些对象能正常工作。不过,不能向用户定义的对象提供 application 作用域。同样,向用户定义的 JScript 对象提供 Session 作用域可能影响对象的功能性。特别地,如果对象具有 Session 作用域,则其他页的脚本可以访问该对象的属性但无法调用它的方法。。同样,向用户定义的 JScript 对象提供 Session 作用域可能影响 Web 应用程序的性能。
高级信息:性能问题
组件的线程模型可能影响 Web 站点的性能。通常,如果对象要存储为“Session”和“Application”状态,则标记有“Both”的对象是推荐在 .asp 文件中使用的对象。不推荐使用单线程、单元线程以及自由线程的对象。
因为不可能总是控制所用对象的线程模型,所以下列原则有助于获得最佳性能:
Page 作用域对象 标记为“Both”或“Apartment”的对象将提供最佳性能。
Application 作用域对象 标记为“Both”并且集成了 FreeThreadedMarshaler 的对象将提供最佳性能。可以使用 标签或 Server.CreateObject 方法将标记为“Both”的对象存储到 Application 对象中。必须对单元线程对象使用 HTML 标签。
Session 作用域对象 标记为“Both”的对象将提供最佳性能。使用单线程或单元线程对象会导致 Web 服务器将会话锁定为一个线程。自由线程对象不锁定会话,但速度很慢。可以使用 标签或 Server.CreateObject 方法将对象存储到“Session”对象中。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-124383/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-124383/
本文围绕ASP对象展开,介绍了page、Session、Application三种作用域对象的创建、使用及释放方式。指出通常应避免在循环中创建对象,还提及了Session和Application作用域的替代方案。此外,分析了组件线程模型对Web站点性能的影响,并给出不同作用域对象的最佳性能选择原则。
608

被折叠的 条评论
为什么被折叠?



