如何缓存经常使用的查询?

时间:2012-10-11 15:36:17

标签: sql-server performance java-ee content-management-system

当有一个Web应用程序会经常查询一些信息时,如何通过缓存查询结果来提高性能? (该信息类似于网站中的头条新闻,我的数据库是SQL Server 2008,应用程序位于tomcat上。)

3 个答案:

答案 0 :(得分:3)

我可以提出以下建议:

  1. 在您的数据库中,您可以使用idex视图,请检查:How to mimick Oracle Materialized Views on MS SQL Server?
  2. 如果您使用过JPA或Hibernate,它可以缓存实体(对象)。
  3. 如果您正在寻找对数据库和ORM不熟悉的缓存系统,也许您可​​以查看MemCache或EHCache。
  4. 一个选项但不推荐您在应用程序中管理缓存,例如您可以在ServletContext(也称为ApplicationContext)中存储国家/地区列表,但您需要实现缓存的业务逻辑(更新,删除)并插入对象),你也需要小心堆内存。
  5. 您可以结合使用上述策略,这取决于您的业务环境

    致以最诚挚的问候,

    埃内斯托。

答案 1 :(得分:1)

这是一个非常普遍的问题,当你进行验证时,有很多选择。

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

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

有些ORM也提供缓存。

并且(可能不是最终)您可以在数据库中定义结构,通过运行复杂查询并将结果保存到更经常查询但查询更便宜的表中来“缓存”这样的结果。

只是一些想法。

答案 2 :(得分:1)

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