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)
调用将从数据库中获取列表项,即使我过去多次执行相同的查询,并且在我看来应该缓存此查询。
我已经设置了"超级用户"和"超级读者"帐户,这被认为是可能导致各种论坛中对象缓存出现问题的问题,但这根本没有帮助。
我错过了什么吗?
我最终找到了答案 - 问题出在我在 GetSiteData
方法中使用的 siteBaseUrl
变量 - 当它需要相对时,它是一个绝对 URL,尽管我没有找到任何文档建议这一点!
因此,虽然提供绝对 URL 将返回正确的数据,但它不会注册为可以缓存的查询。通过相对 URL 发送将返回数据并缓存将来的查询。