SharePoint 跨列表查询似乎不使用缓存

本文关键字:缓存 列表 查询 SharePoint | 更新日期: 2023-09-27 18:32:57

>我在SharePoint 2010中发现对象缓存似乎没有为我们缓存任何查询,而是每次都命中数据库以从SharePoint列表中检索项目。

我们希望提高 SharePoint 网站的性能,该网站具有在许多位置使用 SharePoint 列表的自定义代码。我想缓存我对这些列表所做的查询,因为基础数据是相当静态的。

我们已经研究了查询SharePoint列表的各种方法,此链接表明CrossListQueryCache是利用SharePoint缓存的方法,注意使用接受SPSite对象而不是SPWeb的构造函数(因为使用后者显然永远不会使用缓存(。

我在应用程序中使用的基本代码结构是这样的:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(siteBaseUrl, token))
    {
        using (SPWeb web = site.OpenWeb())
        {
            SPList list = web.Lists["NameOfAList"];
            var crossListQuery = new CrossListQueryInfo
            {
                Lists = string.Format("<Lists><List ID='{0}' /></Lists>", list.ID.ToString("D")),
                ViewFields = "<FieldRef Name='NameOfAField' />",
                UseCache = true,
                Query = string.Empty,
                Webs = @"<Webs Scope=""Recursive"" />"
            };
            var cache = new CrossListQueryCache(crossListQuery);
            var results = cache.GetSiteData(site, siteBaseUrl);
            foreach (DataRow item in results.Rows)
            {
                // use the results
            }
        }
    }
});

我发现,通过对数据库的跟踪,cache.GetSiteData(site, siteBaseUrl)调用将从数据库中获取列表项,即使我过去多次执行相同的查询,并且在我看来应该缓存此查询。

我已经设置了"超级用户"和"超级读者"帐户,这被认为是可能导致各种论坛中对象缓存出现问题的问题,但这根本没有帮助。

我错过了什么吗?

SharePoint 跨列表查询似乎不使用缓存

我最终找到了答案 - 问题出在我在 GetSiteData 方法中使用的 siteBaseUrl 变量 - 当它需要相对时,它是一个绝对 URL,尽管我没有找到任何文档建议这一点!

因此,虽然提供绝对 URL 将返回正确的数据,但它不会注册为可以缓存的查询。通过相对 URL 发送将返回数据并缓存将来的查询。