ASP.NET输出缓存与ASP.NET对象缓存



你能帮我决定以下哪种方案最有效吗。

我有3个用户控件。每个控件都需要根据SQL Server查询的结果生成内容,例如,用户控件#1用查询的输出填充网格视图。

我想利用缓存来减少往返SQL Server数据库的次数。我提出了以下两种解决方案,并想知道哪种方案效果最好。

场景1:

将所有3个用户控件的查询放在一个SQL Server存储过程(Batching)中,在包含页中的用户控件之外执行存储过程,然后为每个用户控件提供其查询输出。通过将所有3个查询放在一个存储过程中,可以减少到数据库的往返行程
在这种情况下,缓存将通过缓存存储过程的输出来实现。因此,存储过程的输出每次都将从内存中取出,以向每个用户控件提供其输出,之后每个用户控件将生成其输出。ASP.NET对象缓存将缓存大约188个不同版本的查询。

场景2:

在每个用户控件内单独查询SQL Server数据库,然后使用每个用户控件获得的查询结果生成每个用户控件的输出。这意味着每个用户控件将分别调用SQL Server数据库。在这种情况下,缓存将通过缓存每个用户控件的输出来实现,因此用户控件不必每次都生成输出,并且可以直接从内存中获取输出。这个场景中的问题是,我将不得不缓存一个或多个用户控件的大约188个不同版本。

提前感谢

无论哪种方式,您都必须缓存188个版本的数据。我的投票是:输出缓存——因为它需要更少的处理来生成HTML(即被包含在aspx页面中;这毕竟是最终目标),与实现几乎完全相同的内存缓存相比(只是需要更多的处理时间,因为缓存的数据必须在每次单个用户请求时转换为HTML,这将远远超过188次)。

您显然了解输出缓存是如何工作的,以及如何根据请求url(查询)缓存不同版本的HTML。

我认为这两种场景不一定是互斥的。如果您愿意的话,应该没有理由不提取SQL查询逻辑,然后使用带有控件的输出缓存。

同样,根据数据更改的频率和获取数据的成本,它的变化会更大。例如,你的问题中没有任何内容表明你不能通过一个DB调用来获取所有数据(适用于所有版本)并将其保存在应用程序缓存中,然后根据需要生成控件。

最新更新