<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[ASP技巧集锦（官方权威版）-1]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Sun, 24 Jun 2007 17:45:50 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	简 介 <br/>　　性能是一个特性。您需要预先设计性能，或是在日后重新编写应用程序。换句话说，什么是最大限度优化 Active Server Pages (ASP) 应用程序性能的好策略？<br/>　　本文为优化 ASP 应用程序和“Visual Basic(R) 脚本编辑器 (VBScript)”提供了许多技巧。对许多陷阱和缺陷进行了讨论。本文所列的建议均在 http://www.microsoft.com 及其他站点上进行了测试，而且工作正常。本文假定您对 ASP 开发有基本的理解，包括对 VBScript 和/或 JScript、ASP Application、ASP Session 和其他 ASP 内部对象（请求、响应和服务器）。<br/>　　ASP 的性能，通常不止取决于 ASP 代码本身。我们并不想在一篇文章中囊括所有的至理名言，只在最后列出与性能相关的资源。这些链接包括 ASP 和非 ASP 主题，包括“ActiveX(R) 数据对象 (ADO)”、“部件对象模型 (COM)”、数据库和“Internet 信息服务器 (IIS)”配置。这些是我们喜欢的链接 - 务请关注它们。<br/>　　<br/>　　技巧 1：在 Web 服务器上缓存常用数据 <br/>　　典型的 ASP 页从后端数据库检索数据，然后将结果转换为超文本标记语言 (HTML)。无论数据库的速度如何，从内存检索数据要比从后端数据库检索数据快得多。从本地硬盘读取数据通常也要比从数据库检索数据快得多。因此，通常可以通过在 Web 服务器（在内存或磁盘）上缓存数据来改善性能。<br/>　　缓存是典型的空间与时间的折衷。如果恰当地缓存数据，您将看到性能会有惊人的提高。为使缓存发挥效力，它必须保持经常重用的数据，而且重新计算这些数据的代价是昂贵的或比较昂贵的。如果缓存充满了垃圾数据，则是对存储器的浪费。<br/>　　不经常变化的数据也是缓存的候选数据，因为您无须担心数据与数据库的同步问题。组合框、引用表、DHTML 碎片、可扩展标记语言 (XML) 字符串、菜单项和站点配置变量（包括数据源名称 (DSN)、Internet 协议 (IP) 地址和 Web 路径）都是缓存的候选数据。注意，您可以缓存数据的表示而不是数据本身。如果 ASP 页不经常更改，而且缓存的成本也非常高（例如，整个产品目录），请考虑预先生成 HTML，而不是在每次请求时重新绘制。<br/>　　数据应缓存在何处，有哪些缓存策略？数据经常缓存在 Web 服务器内存或 Web 服务器磁盘上。下面两个技巧讨论这些选项。<br/>　　<br/>　　技巧 2：在 Application 或 Session 对象中缓存常用数据 <br/>　　ASP Application 和 Session 对象为在内存中缓存数据提供了方便的容器。既可以将数据赋予 Application 对象，也可将数据赋予 Session 对象，这些数据在 HTTP 调用中将保留在内存中。Session 数据按用户存储，而 Application 数据在所有用户间共享。<br/>　　何时将数据载入 Application 或 Session？通常，在 Application 或 Session 启动时加载数据。要在 Application 或 Session 启动时加载数据，请在下面两函数中添加相应的代码：Application_OnStart() 或 Session_OnStart()。这两个函数应该位于 Global.asa；如果没有，可以添加这些函数。也可以在第一次需要数据时加载数据。要进行上述操作，请在 ASP 页中添加一些代码（或编写可重用的脚本函数），这些代码检查数据是否存在，并在数据不存在时加载数据。这是称为迟缓计算的经典性能技术的例子 - 在您的确需要它之前，不进行计算。请看例子：<br/>　　&lt;%<br/>　　Function GetEmploymentStatusList<br/>　　 Dim d<br/>　　 d = Application(&quot;EmploymentStatusList&quot;)<br/>　　 If d = &quot;&quot; Then<br/>　　 &#039; FetchEmploymentStatusList 函数（不显示）<br/>　　 &#039; 从 DB 中取出数据，返回数组<br/>　　 d = FetchEmploymentStatusList()<br/>　　 Application(&quot;EmploymentStatusList&quot;) = d<br/>　　 End If<br/>　　 GetEmploymentStatusList = d<br/>　　End Function<br/>　　%&gt;<br/>　　可以为每一块所需的数据编写类似的函数。<br/>　　数据应该以什么格式存储？任何变量类型均可存储，因为所有脚本变量是各不相同的。例如，可以存储字符串、整型或数组。通常，您将以这些变量类型之一存储 ADO 记录集的内容。若要获取 ADO 记录集衍生的数据，可以手工将数据复制到 VBScript 变量中，每次一个字段。使用一个 ADO 记录集保留函数 GetRows()、GetString() 或 Save() (ADO 2.5)，会更快更简便。完整而详细的内容已超出了本文的范围。下面的演示函数使用了 GetRows() 来返回记录集数据的数组：<br/>　　&#039; 取记录集，以数组返回<br/>　　Function FetchEmploymentStatusList<br/>　　 Dim rs <br/>　　 Set rs = CreateObject(&quot;ADODB.Recordset&quot;)<br/>　　 rs.Open &quot;select StatusName, StatusID from EmployeeStatus&quot;, _<br/>　　 &quot;dsn=employees;uid=sa;pwd=;&quot;<br/>　　 FetchEmploymentStatusList = rs.GetRows() &#039; 以数组返回数据<br/>　　 rs.Close<br/>　　 Set rs = Nothing<br/>　　End Function<br/>　　对上面示例的进一步改进应当是缓存该列表的 HTML，而不是缓存数组。下面是一个简单的范例：<br/>　　&#039; 取记录集，以“HTML 选项”列表返回<br/>　　Function FetchEmploymentStatusList<br/>　　 Dim rs, fldName, s<br/>　　 Set rs = CreateObject(&quot;ADODB.Recordset&quot;)<br/>　　 rs.Open &quot;select StatusName, StatusID from EmployeeStatus&quot;, _<br/>　　 &quot;dsn=employees;uid=sa;pwd=;&quot;<br/>　　 s = &quot;&lt;select name=&quot;&quot;EmploymentStatus&quot;&gt;&quot; &amp; vbCrLf<br/>　　 Set fldName = rs.Fields(&quot;StatusName&quot;) &#039; ADO 字段绑定<br/>　　 Do Until rs.EOF<br/>　　 &#039; 下面一行违背了不要进行字符串连接，<br/>　　 &#039; 但这是可以的，因为我们正在建立高速缓存<br/>　　 s = s &amp; &quot; &lt;option&gt;&quot; &amp; fldName &amp; &quot;&lt;/option&gt;&quot; &amp; vbCrLf<br/>　　 rs.MoveNext<br/>　　 Loop<br/>　　 s = s &amp; &quot;&lt;/select&gt;&quot; &amp; vbCrLf<br/>　　 rs.Close<br/>　　 Set rs = Nothing &#039; 参见尽早释放<br/>　　 FetchEmploymentStatusList = s &#039; 以字符串返回数据<br/>　　End Function<br/>　　在正常的情况下，可以在 Application 或 Session 作用域中缓存 ADO 记录集本身。有两个警告： <br/>　　ADO 必须为标记的自由线程 <br/>　　必须使用断开连接的记录集。 <br/>　　如果不能保证满足这两个要求，请不要缓存 ADO 记录集。在下面的非灵活组件和不要缓存连接技巧中，我们将讨论在 Application 或 Session 作用域中存储 COM 对象的危险。<br/>　　如果在 Application 或 Session 作用域中存储数据，这些数据将一直保留在那儿，直到在程序中改变它、Session 过期或 Web 应用程序重新启动时为止。数据需要更新如何处理？若要用手工强制更新应用程序数据，可以调用只允许管理员访问的数据更新 ASP 页。另外，还可以通过函数，周期地自动刷新数据。下面的示例存储带缓存数据的时间戳，在指定时间间隔后刷新数据。<br/>　　&lt;%<br/>　　&#039; 未显示错误处理...<br/>　　Const Update_INTERVAL = 300 &#039; 刷新时间间隔，以秒计<br/>　　<br/>　　&#039; 函数返回雇佣状态列表<br/>　　Function GetEmploymentStatusList<br/>　　 UpdateEmploymentStatus<br/>　　 GetEmploymentStatusList = Application(&quot;EmploymentStatusList&quot;)<br/>　　End Function<br/>　　<br/>　　&#039; 定期更新缓存的数据<br/>　　Sub UpdateEmploymentStatusList<br/>　　 Dim d, strLastUpdate<br/>　　 strLastUpdate = Application(&quot;LastUpdate&quot;)<br/>　　 If (strLastUpdate = &quot;&quot;) or _<br/>　　 (Update_INTERVAL DateDiff(&quot;s&quot;, strLastUpdate, Now)) Then<br/>　　<br/>　　 &#039; 注意：此处可能有两个或多个调用。这是可以的，只不过<br/>　　 &#039; 产生几个不必要的取指令罢了（就此有一个工作区）<br/>　　<br/>　　 &#039; FetchEmploymentStatusList 函数（不显示）<br/>　　 &#039; 从 DB 中取数据，返回一个数组<br/>　　 d = FetchEmploymentStatusList()<br/>　　<br/>　　 &#039; 更新 Application 对象。用 Application.Lock()<br/>　　 &#039; 来确保一致的数据<br/>　　 Application.Lock<br/>　　 Application(&quot;EmploymentStatusList&quot;) = d<br/>　　 Application(&quot;LastUpdate&quot;) = CStr(Now)<br/>　　 Application.Unlock<br/>　　 End If<br/>　　End Sub<br/>　　%&gt;<br/>　　其他示例，请参阅具有 Application 数据的最快列表框（英文）。<br/>　　请注意，在 Session 或 Application 对象中缓存大型数组并非上策。在访问数组元素之前，脚本语言的语法要求建立整个数组的临时副本。例如，如果在 Application 对象中缓存了将美国邮政编码映射到本地气象站的字符串数组，该字符串数组有 100,000 个元素，ASP 在找出一个字符串之前，必须将所有 100,000 个气象站复制到临时数组中。在这种情况下，建立带自定义方法的自定义组件，来存储气象站 - 或使用一个字典组件，也许更好。<br/>　　请不要在倒洗澡水时把孩子一同倒掉，对这种观点的一个新的注解是：数组提供了对内存中相邻关键-数据对的快速查找和存储。索引字典比索引数组要慢。您应该根据具体情况选择能够提供最佳性能的数据结构。 
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] ASP技巧集锦（官方权威版）-1]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>