1

当网页应用会频繁查询某些信息时,如何通过缓存查询结果来提高性能?(信息就像网站上的头条新闻,我的数据库是 SQL Server 2008,应用程序在 tomcat 上。)

4

3 回答 3

3

我可以提出以下建议:

  1. 在您的数据库中,您可以使用 idex 视图,请查看: 如何在 MS SQL Server 上模仿 Oracle 物化视图?.
  2. 如果您使用过 JPA 或 Hibernate,它可以缓存实体(对象)。
  3. 如果您正在寻找与数据库和 ORM 无关的缓存系统,也许您可​​以查看 MemCache 或 EHCache。
  4. 一个选项但不推荐在应用程序中管理缓存,例如,您可以在 ServletContext(也称为 ApplicationContext)中存储国家列表,但您需要实现缓存的业务逻辑(更新、删除和插入对象) ),你也需要小心堆内存。

您可以结合使用上述策略,具体取决于您的业务环境

此致,

埃内斯托。

于 2012-10-11T15:46:20.930 回答
1

这是一个非常笼统的问题,正如您所料,有很多选择。

在最接近 UI 的地方,您的 Web 平台可能具有“内容缓存”。例如,ASP.NET 将在指定的时间段内缓存页面的某些部分。

您可以使用像 memcached 这样的缓存工具并缓存记录集(或任何独立的 Java 数据结构)。

一些 ORM 也提供缓存。

而且(可能不是最终)您可以通过运行复杂的查询并将结果保存到查询频率更高但查询成本更低的表中,从而在数据库中定义结构以“缓存”这样的结果。

只是一些想法。

于 2012-10-11T15:39:52.963 回答
1

一个非常大的网站的答案就是以上所有内容。我们通过存储过程进行所有查询。这很有帮助,因为查询已编译并重用了一个执行计划。我们有一个邪恶的复杂表值函数。太贵了,我们建了一个缓存表。该表具有与函数相同的一般格式,但有两个附加功能。一是过期时间。另一个是搜索键。搜索键是连接在一起的函数中的参数。每当我们要查询该表时,我们都会运行一个 Proc 来检查数据是否过时。如果是我们启动事务删除行,然后运行函数并插入行。这意味着我们运行该函数的次数可能是过去的 2% 或 3%,而且我们为检查陈旧性而进行的 proc 调用要便宜得多。每当应用程序更新相关数据时,它都会将缓存行更新为陈旧的 - 但它不会删除它们,我们将其留给缓存检查功能。为什么?好吧,也许现在没有人需要这些数据,所以更少的数据库命中。然后我们到达第二层。我们在 memcached 中缓存了许多记录集。包括调用该函数的所有 proc,等等。这实际上发生在我们仍然拥有的 asp 层中。ADO 记录集可以本地保存到 xml,然后作为字符串进入 memcache。这实际上发生在我们仍然拥有的 asp 层中。ADO 记录集可以本地保存到 xml,然后作为字符串进入 memcache。这实际上发生在我们仍然拥有的 asp 层中。ADO 记录集可以本地保存到 xml,然后作为字符串进入 memcache。

于 2012-10-13T01:21:34.747 回答