对象的作用域决定哪些脚本可以使用该对象。默认情况下,当您创建对象实例时,该对象具有页作用域。同一 ASP 页中的任何脚本命令都能使用该页作用域的对象;当 ASP 页送回客户端时,该对象即被释放。对大多数对象来说,推荐的作用域是页作用域。您可以改变一个对象的作用域,使其可被其他页的脚本使用。本主题将解释如何使用页作用域的对象以及如何改变对象的作用域。
使用页作用域对象
在 ASP 页上用 Se***r.CreateObject 创建的对象在该页的生存期内一直存在。该对象对该页的任何脚本命令都是可访问的,当 ASP 处理完该页时,该对象即被释放。因此,对象具有该页的作用域或生命周期。
在用 Visual Basic 或 VBScript 编程时,要注意在 ASP 处理完该页之前不要释放对象。例如,以下语句经常用于通过将对象变量赋以 Nothing 值来释放对象:
Set myObj = Nothing
如果您在 ASP 页中包含了该语句,那么任何使用 myObj 的企图都将会返回一个预期的错误代码。但在内部,即使在对象释放以后,ASP 仍保留对它的引用。当您在脚本中不能使用对象时,对象的资源直到 ASP 处理完页之后才释放。同样,如果您通过创建另一个对象实例并将其赋给已使用过的对象变量来释放该对象时,ASP 将保留对原对象实例的引用。对大多数脚本来说,创建多个对象可能不会产生问题,但如果对象使用共享资源,比如数据库连接,就有可能出现问题。
<%
For I = 0 to 1000
Set Conn = Se***r.CreateObject("AD***.Connection") Co***Open "connection string"
Next
%>
总的来说,应该尽量避免在一个循环内部创建对象。如果无法避免,您应该手工释放被对象使用过的资源。如果 Connection 对象仅被创建一次,且数据资源的物理连接在每个循环中被打开然后关闭,那么上例将会正常运行:
<%
Set Conn = Se***r.CreateObject("AD***.Connection")
For I = 0 to 1000 Co***Open "connection string" Co***Close
Next
%>
为对象赋予会话作用域
在应用程序中,对于每个新会话,都会创建 session-scope 对象,并且在会话结束后会将其释放。因此,每个活动的会话都有一个对象。会话作用域用于从多个脚本中调用的对象,但只影响一个用户会话。您可以只在需要时才为对象赋予会话作用域。如果确实需要使用会话作用域,那么就必须了解提供对象的组件的线程模型,因为它影响性能和对象的安全环境。详细信息,请参阅本主题的“高级信息:性能问题” 。
要为对象赋予会话作用域,请将对象存储在 ASP Session 内建对象中,您既可以在 Gl***l.asa 文件中使用 ">