<?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技巧集锦（官方权威版）-2]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Sun, 24 Jun 2007 17:46:32 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	技巧 3：在 Web 服务器磁盘上缓存数据和 HTML <br/>　　有时，数据过多不能在内存中进行缓存。“过多”是一种定性的判断；它取决于打算消耗的内存量，还有缓存项的数量和这些项的检索频率。总之，如果有过多的数据要在内存中缓存，请考虑以文本或 XML 文件的形式，在 Web 服务器的硬盘上缓存数据。可以将在磁盘上缓存数据和在内存中缓存数据组合起来，为站点建立最优的缓存策略。<br/>　　注意，在度量单个 ASP 页的性能时，在磁盘上检索数据不一定比从数据库中检索数据快。但是，缓存减轻了数据库和网络的负荷。在高负荷情况下，这将明显提高总体通信量。在查询成本很高时缓存查询的结果，缓存便非常有效，例如多表联合或复杂的存储过程，或缓存大型的结果集。按照惯例，测试竞争方案。<br/>　　ASP 和 COM 提供了几种构建磁盘缓存方案的工具。ADO 记录集的 Save() 和 Open() 函数，保存和加载磁盘上的记录集。您可以使用这些方法重写上面 Application 数据缓存技巧中的范例代码，用 Save() 文件替换向 Application 对象写入数据的代码。<br/>　　还有其他一些处理文件的组件： <br/>　　Scripting.FileSystemObject 使您能够创建、读取和写入文件。 <br/>　　MSXML 是随 Internet Explorer 提供的 Microsoft(R) XML 解析器，它支持保存和加载 XML 文档。 <br/>　　LookupTable 对象（在 MSN 上使用的范例）是从磁盘加载简单列表的良好选择。 <br/>　　最后，请考虑在磁盘上缓存数据的表示，而不是数据本身。预制的 HTML 可以作为 .htm 或 .asp 文件存储在磁盘上；超级链接可以直接指向这些文件。可以使用商业工具，如 XBuilder 或 Microsoft(R) SQL Server 的 Internet 发行功能来自动化 HTML 生成过程。另外，可以将 HTML 片段 #include 到 .asp 文件。还可以使用 FileSystemObject 从磁盘读取 HTML 文件或使用 XML 进行早期调整（英文）。<br/>　　<br/>　　技巧 4：避免在 Application 或 Session 对象中缓存非灵活组件 <br/>　　虽然在 Application 或 Session 对象中缓存数据是个好主意，但是缓存 COM 对象可能有严重缺陷。将常用 COM 对象嵌入 Application 或 Session 对象通常具有吸引力。遗憾的是，很多 COM 对象，包括用 Visual Basic 6.0 或更早版本编写的 COM 对象，在 Application 或 Session 对象中存储时将导致严重的瓶颈。<br/>　　特别是任何非灵活组件，在 Session 或 Application 对象中缓存时将导致性能瓶颈。灵活组件是标记为 ThreadingModel=Both 的组件（它聚集了自由线程汇集器 (FTM)）或标记为 ThreadingModel=Neutral 的组件（Windows(R) 2000 和 COM+ 中新增的“中性”模型。）下列组件是非灵活的： <br/>　　自由线程组件（除非它们聚集了 FTM）。 <br/>　　单元线程组件。 <br/>　　单线程组件。 <br/>　　已配置组件（Microsoft Transaction Server (MTS)/COM+ 库和服务器包/应用程序）为非灵活组件，除非它们是“中性”线程的。单元线程组件和其他非灵活组件最适于在页作用域工作（也就是说，它们在单个 ASP 页上创建和销毁）。<br/>　　在 IIS 4.0 中，标记为 ThreadingModel=Both 的组件被视为灵活的。在 IIS 5.0 中，这已经不够了。组件不仅必须标记为 Both，而且还必须聚集 FTM。灵活性文章说明了如何使得用“活动模板库”编写的 C++ 组件聚集 FTM。请注意，如果组件缓存接口指针，这些指针本身必须为灵活的、或者必须存储在“COM 全局接口表 (GIT)”中。如果不能重新编译 Both 线程组件，使它聚集 FTM，则可以将该组件标记为 ThreadingModel=Neutral。另外，如果不希望 IIS 进行灵活性检查（这样，希望非灵活组件能够存储在 Application 或 Session 作用域中），可以在 metabase 中设置 AspTrackThreadingModel 为 True。不主张更改 AspTrackThreadingModel。<br/>　　如果试图在 Application 对象中存储用 Server.CreateObject 创建的非灵活组件，IIS 5.0 将产生错误。可以通过在 Global.asa 中使用 &lt;object runat=server scope=application ...&gt; 解决该问题，但是不主张这样做，因为这将导致汇集和串行化，说明如下。<br/>　　如果缓存非灵活组件，会发生什么错误呢？缓存在 Session 对象中的非灵活组件，将把会话“锁定”到某个 ASP 工作器线程。ASP 维护着一个工作器线程池，它向请求提供服务。通常，新的请求由第一个可用的工作器线程来处理。如果 Session 被锁定到某个线程，则该请求将不得不等待它所关联的线程变为可用。打个比方：您进入一个超市，挑选了一些食品，然后在第 3 号收款台交款。从这以后，每当您在这个超市购买食品，都不得不始终在第 3 号收款台交款，即使是在其他收款台人少或没人时。<br/>　　将非灵活组件存储在 Applicaton 作用域甚至会对性能产生更严重的影响。ASP 将不得不创建专用的线程来运行非灵活的、Applicaton 作用域内的组件。这将导致两种后果：所有调用不得不被汇集到该线程，而且所有调用被串行化。汇集意味着：参数不得不存储在内存的共享区；对该专用线程执行昂贵的上下文切换；组件的方法被执行；结果汇集到共享区域；以及经过另一个昂贵的上下文切换，使控制权返回原来的线程。串行化意味着所有方法必须一个挨一个地运行（同一时刻只能运行一个方法）。两个不同的 ASP 工作器线程不可能同时执行共享组件上的方法。这将扼杀并行机制，尤其是在多处理器计算机上。更坏的是，所有非灵活的、Application 作用域内的组件都将共享一个线程（“Host STA”），所以串行化的影响更加严重。<br/>　　是否感到困惑？下面我们提出几个通用规则。如果您正在用 Visual Basic (6.0) 或更早版本编写对象，请不要将它们缓存在 Application 或 Session 对象中。如果您不知道对象的线程模型，就不要缓存它。不要缓存非灵活对象，而应当在每页上创建并释放它们。对象将直接运行在 ASP 工作器线程上，这样，将不会发生汇集或串行化。如果 COM 对象正运行在 IIS 框中，而且如果它们没有花很长时间来初始化和取消，性能将是足够的。注意，不要用该方法使用单线程对象。小心：VB 可以创建单线程的对象！如果您必须以该方式使用单线程的对象（如 Microsoft Excel 电子表格），则不要期望有很高的吞吐量。<br/>　　当 ADO 被标记为自由线程时，则缓存 ADO 记录集是安全的。要将 ADO 标记为自由线程，请使用 Makfre15.bat 文件，该文件通常位于如下目录中：&#92;&#92;Program Files&#92;Common&#92;System&#92;ADO。<br/>　　警告： 如果您正在用 Microsoft Access 作为数据库，则不应当将 ADO 标记为自由线程。通常，ADO 记录集还必须是断开连接的，如果您不能控制站点的 ADO 配置（例如，您是独立的软件厂商 [ISV]，将 Web 应用程序卖给客户，然后由他们来管理他们自己的配置），那么不缓存记录集可能会更好。<br/>　　词典组件也是灵活对象。LookupTable 从数据文件加载它的数据，并且它对组合框数据和配置信息是有用的。来自 Duwamish Books 的 PageCache 对象提供了目录语义，和 Caprock Dictionary 的表现一样。这些对象或它们的派生对象可以构成有效缓存策略的基础。注意，Scripting.Dictionary 对象不是灵活的，所以不应当存储在 Application 或 Session 作用域。<br/>　　<br/>　　技巧 5：不要在 Application 或 Session 对象中缓存数据库连接 <br/>　　缓存 ADO 连接通常是不好的策略。如果一个 Connection 对象存储在 Application 中，并在所有页上使用，那么所有页将竞争使用该连接。如果 Connection 对象存储在 ASP Session 对象中，那么将为每个用户创建数据库连接。这将连接池的好处毁于一旦，并对 Web 服务器和数据库产生不必要的压力。<br/>　　取代缓存数据库连接的方法是，在每个使用 ADO 的 ASP 页上创建并取消 ADO 对象。这是个有效的方法，因为 IIS 具有内置的数据库连接池。更准确的说，IIS 自动启用 OLEDB 和 ODBC 连接池。这确保了创建并取消每个页上的连接将是有效的。<br/>　　由于被连接的记录集中存储有对数据库连接的引用，所以，不应当在 Application 或 Session 对象中缓存被连接的记录集。但是，可以安全地缓存断开连接的记录集，因为它不包含对其数据连接的引用。要断开记录集的连接，请执行如下两个步骤：<br/>　　 Set rs = Server.CreateObject(&quot;ADODB.RecordSet&quot;)<br/>　　 rs.CursorLocation = adUseClient &#039; 第 1 步<br/>　　 &#039; 植入带数据的记录集<br/>　　 rs.Open strQuery, strProv<br/>　　 &#039; 现在断开记录集同数据提供者和数据源的连接<br/>　　 rs.ActiveConnection = Nothing &#039; 第 2 步<br/>　　有关连接池的详细信息，请参阅 ADO 和 SQL Server（英文）引用。 
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] ASP技巧集锦（官方权威版）-2]]></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>