Я нашел в 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)
будет захватывать элементы списка из базы данных, хотя я выполнял тот же запрос много раз в прошлом и в моем сознании этот запрос должен быть кэширован.
Я создал учетные записи "супер пользователя" и "супер читателя", которые были предложены как проблема, которая может вызвать проблемы с кэшированием объектов на разных форумах, но это совсем не помогло.
Есть что-то, что мне не хватает?
В итоге я нашел ответ - проблема была в переменной siteBaseUrl
которую я использовал в методе GetSiteData
- это был абсолютный URL-адрес, когда он должен быть относительным, хотя я не нашел никакой документации, которая подсказывает это!
Поэтому, пока абсолютный URL-адрес вернет правильные данные, он не будет регистрироваться как запрос, который может быть кэширован. Отправка через относительный URL-адрес будет возвращать данные и кешировать будущие запросы.