0

您能否帮助我确定以下哪种方案最有效。

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

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

场景#1:

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

场景#2:

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

提前致谢

4

2 回答 2

1

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

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

于 2012-02-01T00:00:33.960 回答
0

我不认为这两种情况必然相互排斥。如果您愿意,应该没有理由不能提取 SQL 查询逻辑,然后将输出缓存与控件一起使用。

同样,尽管它确实会根据数据更改的频率以及开始获取数据的成本而有所不同。例如,您的问题中没有任何内容表明您无法进行单个数据库调用来获取所有数据(适用于所有版本)并将其保存在 App 缓存中,然后根据需要生成控件。

于 2012-02-01T00:53:21.980 回答