Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Кэширование может означать разницу между медленным и быстрым веб-приложением. Это руководство является первым из четырех, которые подробно рассмотрим кэширование в ASP.NET. Узнайте о ключевых понятиях кэширования и применении кэширования к уровню презентации с помощью элемента управления ObjectDataSource.
Введение
В информатике кэширование — это процесс получения данных или сведений, дорогостоящих для получения, и сохранение копии в месте, доступном быстрее. Для приложений, управляемых данными, большие и сложные запросы обычно используют большинство времени выполнения приложения. Таким образом, производительность приложения часто можно улучшить, сохраняя результаты дорогостоящих запросов базы данных в памяти приложения.
ASP.NET 2.0 предлагает различные варианты кэширования. Всю веб-страницу или отрисованную разметку пользовательского элемента управления можно кэшировать с помощью кэширования выходных данных. Элементы управления ObjectDataSource и SqlDataSource предоставляют возможности кэширования, что позволяет кэшировать данные на уровне элемента управления. И кэш данных ASP.NET предоставляет широкий API кэширования, который позволяет разработчикам страниц программно кэшировать объекты. В этом руководстве и следующих трех мы рассмотрим возможности кэширования ObjectDataSource, а также кэш данных. Мы также рассмотрим, как кэшировать данные на уровне приложений при запуске и как сохранять кэшированные данные свежими с помощью зависимостей кэша SQL. В этих руководствах не рассматриваются кэширование выходных данных. Подробный просмотр кэширования выходных данных см. в разделе "Кэширование выходных данных" в ASP.NET 2.0.
Кэширование можно применять в любом месте архитектуры, начиная с уровня доступа к данным до уровня презентации. В этом руководстве мы рассмотрим применение кэширования к уровню презентации с помощью элемента управления ObjectDataSource. В следующем руководстве мы рассмотрим кэширование данных на уровне бизнес-логики.
Основные понятия кэширования ключей
Кэширование может значительно повысить общую производительность и масштабируемость приложения, создавая данные, которые дорого обходятся в генерации, и сохраняя их копию в месте, откуда к ним можно получить более эффективный доступ. Так как кэш содержит только копию фактических, базовых данных, он может стать устаревшим или устаревшим, если базовые данные изменяются. Для борьбы с этим разработчик страницы может указать критерии, с помощью которых элемент кэша будет вытеснился из кэша, используя одно из следующих условий:
- Критерии на основе времени определяют возможность добавления элемента в кэш на абсолютную или скользящую длительность. Например, разработчик страницы может указать длительность, например, 60 секунд. С абсолютной длительностью кэшированный элемент вытесняется через 60 секунд после добавления в кэш независимо от частоты доступа к нему. При скользящей длительности кэшированный элемент удаляется через 60 секунд после последнего доступа.
- Критерии на основе зависимостей позволяют связать зависимость с элементом при добавлении в кэш. При изменении зависимостей элемента он вытеснен из кэша. Зависимость может быть файлом, другим элементом кэша или сочетанием двух. ASP.NET 2.0 также поддерживает зависимости кэша SQL, что позволяет разработчикам добавлять элемент в кэш и удалять его при изменении данных в базе данных. Мы рассмотрим зависимости кэша SQL в предстоящем руководстве по использованию зависимостей кэша SQL .
Независимо от указанных условий вытеснения, элемент в кэше может быть удалён или очищен до выполнения условий на основе времени или зависимостей. Если кэш достиг своей емкости, то перед добавлением новых элементов необходимо удалить существующие элементы. Следовательно, при программной работе с кэшируемыми данными крайне важно всегда предположить, что кэшированные данные могут не присутствовать. Мы рассмотрим шаблон, используемый при доступе к данным из кэша программным способом в следующем руководстве, кэширование данных в архитектуре.
Кэширование предоставляет экономичный способ повышения производительности приложения. Как Стивен Смит сформулирует в своей статье ASP.NET кэширование: методы и рекомендации:
Кэширование может быть хорошим способом получить достаточную производительность, не требуя много времени и анализа. Память дешевая, поэтому если вы можете повысить производительность, за счет кэширования результатов на 30 секунд вместо того, чтобы тратить день или неделю на оптимизацию кода или базы данных, выполните кэширование (при условии, что данные устаревшие на 30 секунд приемлемы) и двигайтесь дальше. В конце концов, плохой дизайн, вероятно, догонит вас, поэтому, конечно, вы должны попытаться правильно разработать приложения. Но если вам просто нужно сегодня добиться достаточной производительности, кэширование может быть отличным [подходом] и подарит вам время, чтобы заняться рефакторингом вашего приложения позже, когда у вас будет возможность.
В то время как кэширование может обеспечить заметные улучшения производительности, оно неприменимо во всех ситуациях, например с приложениями, используюющими данные в режиме реального времени, часто обновляемыми данными или в тех случаях, когда даже кратковременные устаревшие данные неприемлемы. Но для большинства приложений следует использовать кэширование. Дополнительные сведения о кэшировании в ASP.NET 2.0 можно найти в разделе «Кэширование для производительности» учебника ASP.NET 2.0 QuickStart Tutorials.
Шаг 1. Создание веб-страниц кэширования
Прежде чем приступить к изучению возможностей кэширования ObjectDataSource, сначала рассмотрим возможности создания страниц ASP.NET в нашем проекте веб-сайта, необходимых для этого руководства и следующих трех. Сначала добавьте новую папку с именем Caching
. Затем добавьте в нее следующие ASP.NET страницы, чтобы связать каждую страницу с главной страницей Site.master
:
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
Рис. 1. Добавление страниц ASP.NET для учебников Caching-Related
Как и в других папках, Default.aspx
в папке Caching
перечислены учебные материалы в соответствующем разделе. Помните, что элемент SectionLevelTutorialListing.ascx
управления пользователем предоставляет эту функцию. Поэтому добавьте этот элемент управления Default.aspx
пользователем, перетащив его из Обозреватель решений в представление конструктора страницы.
Рис. 2. Добавьте элемент управления SectionLevelTutorialListing.ascx
в Default.aspx
(Щелкните, чтобы просмотреть изображение полного размера)
Наконец, добавьте эти страницы в качестве записей в Web.sitemap
файл. В частности, добавьте следующую разметку после раздела "Работа с двоичными данными" <siteMapNode>
:
<siteMapNode title="Caching" url="~/Caching/Default.aspx"
description="Learn how to use the caching features of ASP.NET 2.0.">
<siteMapNode url="~/Caching/ObjectDataSource.aspx"
title="ObjectDataSource Caching"
description="Explore how to cache data directly from the
ObjectDataSource control." />
<siteMapNode url="~/Caching/FromTheArchitecture.aspx"
title="Caching in the Architecture"
description="See how to cache data from within the
architecture." />
<siteMapNode url="~/Caching/AtApplicationStartup.aspx"
title="Caching Data at Application Startup"
description="Learn how to cache expensive or infrequently-changing
queries at the start of the application." />
<siteMapNode url="~/Caching/SqlCacheDependencies.aspx"
title="Using SQL Cache Dependencies"
description="Examine how to have data automatically expire from the
cache when its underlying database data is modified." />
</siteMapNode>
После обновления Web.sitemap
найдите минутку и посмотрите сайт с учебными материалами через браузер. Меню слева теперь содержит элементы для учебников по кэшированию.
Рис. 3. Карта сайта теперь включает разделы учебников по кэшированию.
Шаг 2. Отображение списка продуктов на веб-странице
В этом руководстве описывается, как использовать встроенные функции кэширования элемента управления ObjectDataSource. Прежде чем мы рассмотрим эти функции, мы сначала нуждаемся в странице для работы. Давайте создадим веб-страницу, которая использует GridView для перечисления сведений о продукте, полученных объектом ObjectDataSource из ProductsBLL
класса.
Начните с открытия ObjectDataSource.aspx
страницы в папке Caching
. Перетащите GridView из панели элементов в конструктор, задайте для свойства ID
значение Products
, и из его смарт-тега выберите привязать его к новому элементу управления ObjectDataSource, названному ProductsDataSource
. Настройте ObjectDataSource для работы с классом ProductsBLL
.
Рис. 4. Настройка ObjectDataSource для использования ProductsBLL
класса (щелкните, чтобы просмотреть изображение полного размера)
На этой странице мы создадим GridView с возможностью редактирования, чтобы изучить процесс изменения данных в ObjectDataSource с помощью интерфейса GridView. Оставьте раскрывающийся список на вкладке SELECT в состоянии по умолчанию GetProducts()
, но измените выбранный элемент на вкладке UPDATE на перегрузку UpdateProduct
, которая принимает productName
, unitPrice
, и productID
в качестве параметров ввода.
Рис. 5. Установка списка Drop-Down вкладки UPDATE для соответствующей UpdateProduct
перегрузки (щелкните, чтобы просмотреть изображение полного размера)
Наконец, установите раскрывающиеся списки на вкладках INSERT и DELETE в положение «Нет» и нажмите кнопку «Готово». После завершения работы мастера настройки источника данных Visual Studio задает для свойства ObjectDataSource OldValuesParameterFormatString
значение original_{0}
. Как описано в руководстве по вставке, обновлению и удалению данных , это свойство необходимо удалить из декларативного синтаксиса или вернуться к значению по умолчанию, {0}
чтобы рабочий процесс обновления продолжался без ошибок.
Кроме того, при завершении мастера Visual Studio добавляет поле в GridView для каждого поля данных продукта. Удалите все, кроме ProductName
, CategoryName
и UnitPrice
BoundFields. Затем обновите HeaderText
свойства каждого из этих связанных полей на продукт, категорию и цену соответственно. Так как поле ProductName
является обязательным, преобразуйте BoundField в TemplateField и добавьте к нему RequiredFieldValidator для EditItemTemplate
. Аналогичным образом преобразуйте UnitPrice
BoundField в TemplateField и добавьте CompareValidator, чтобы убедиться, что значение, введенное пользователем, является допустимым значением валюты, которое больше или равно нулю. Помимо этих изменений, вы можете выполнять любые эстетические изменения, такие как выравнивание значения UnitPrice
по правому краю или указание форматирования текста UnitPrice
в его интерфейсах для чтения и редактирования.
Сделайте gridView редактируемым, установив флажок "Включить редактирование" в смарт-теге GridView. Также установите флажки "Включить разбиение по страницам" и "Включить сортировку".
Замечание
Требуется ознакомиться с настройкой интерфейса редактирования GridView? В этом случае вернитесь к руководству по настройке интерфейса изменения данных .
Рис. 6. Включение поддержки GridView для редактирования, сортировки и разбиения на страницы (щелкните, чтобы просмотреть изображение полного размера)
После внесения этих изменений декларативная разметка GridView и ObjectDataSource должна выглядеть следующим образом:
<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
AllowPaging="True" AllowSorting="True">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:TemplateField HeaderText="Product" SortExpression="ProductName">
<EditItemTemplate>
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator1" Display="Dynamic"
ControlToValidate="ProductName" SetFocusOnError="True"
ErrorMessage="You must provide a name for the product."
runat="server">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server"
Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
<EditItemTemplate>
$<asp:TextBox ID="UnitPrice" runat="server" Columns="8"
Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1"
ControlToValidate="UnitPrice" Display="Dynamic"
ErrorMessage="You must enter a valid currency value with no
currency symbols. Also, the value must be greater than
or equal to zero."
Operator="GreaterThanEqual" SetFocusOnError="True"
Type="Currency" runat="server"
ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>
<ItemStyle HorizontalAlign="Right" />
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("UnitPrice", "{0:c}") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="{0}" SelectMethod="GetProducts"
TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Как показано на рисунке 7, редактируемый GridView перечисляет имя, категорию и цену каждого продукта в базе данных. Попробуйте протестировать функциональность страницы: отсортируйте результаты, пролистайте их и измените запись.
Рис. 7: Название каждого продукта, категория и цена перечислены в сортируемом, страничном, редактируемом GridView (Нажмите, чтобы просмотреть изображение в полный размер)
Шаг 3. Изучение процесса запроса данных в ObjectDataSource.
Products
GridView извлекает данные для отображения путем вызова Select
метода ProductsDataSource
ObjectDataSource. Объект ObjectDataSource создает экземпляр класса бизнес-логического слоя ProductsBLL
и вызывает его метод GetProducts()
, который, в свою очередь, вызывает метод ProductsTableAdapter
уровня доступа к данным GetProducts()
. Метод DAL подключается к базе данных Northwind и выдает настроенный SELECT
запрос. Затем эти данные возвращаются в DAL, который упаковывает их в NorthwindDataTable
. Объект DataTable возвращается в BLL, который возвращает его объекту ObjectDataSource, который возвращает его в GridView. Затем GridView создает объект GridViewRow
для каждого элемента DataRow
в DataTable, и каждый GridViewRow
в конечном итоге отображается в HTML, который возвращается клиенту и показывается в браузере у посетителя.
Эта последовательность событий происходит каждый и каждый раз, когда GridView должен привязаться к его базовым данным. Это происходит при первом посещении страницы при переходе с одной страницы данных на другую, при сортировке GridView или при изменении данных GridView через встроенные интерфейсы редактирования или удаления. Если состояние представления GridView отключено, GridView будет перепривязан при каждом постбэке. GridView также может быть явным образом перепривязан к своим данным путем вызова его метода DataBind()
.
Чтобы полностью оценить частоту получения данных из базы данных, давайте отобразим сообщение, указывающее, когда данные извлекаются повторно. Добавьте веб-элемент управления Label над элементом GridView с именем ODSEvents
. Очистите свойство Text
и задайте свойству EnableViewState
значение false
. Под меткой добавьте веб-элемент управления Button и установите для свойства Text
значение Postback.
Рис. 8. Добавление метки и кнопки на страницу над GridView (щелкните, чтобы просмотреть полноразмерное изображение)
Во время рабочего процесса доступа к данным событие ObjectDataSource Selecting
запускается перед созданием основного объекта и вызовом его настроенного метода. Создайте обработчик событий для этого события и добавьте следующий код:
protected void ProductsDataSource_Selecting(object sender,
ObjectDataSourceSelectingEventArgs e)
{
ODSEvents.Text = "-- Selecting event fired";
}
Каждый раз, когда ObjectDataSource отправляет запрос к архитектуре данных, метка будет отображать событие выбора текста.
Посетите эту страницу в браузере. При первом посещении страницы отображается событие выбора текста. Нажмите кнопку "Обратная связь" и обратите внимание, что текст исчезает (если для свойства GridView EnableViewState
задано значение true
по умолчанию). Это связано с тем, что при обратной отправке GridView восстанавливается из состояния представления и поэтому не обращается к ObjectDataSource за своими данными. Однако сортировка, разбиение на страницы или редактирование данных приводит к повторной привязке GridView к источнику данных, и, следовательно, событие Selecting снова активируется.
Рис. 9. При каждом переподключении GridView к источнику данных отображается триггер выбора (щелкните, чтобы просмотреть изображение в полном размере)
Рис. 10. Нажатие кнопки обратной передачи приводит к восстановлению GridView из состояния представления (щелкните, чтобы просмотреть полноразмерное изображение)
Может показаться неэффективным извлекать данные из базы данных каждый раз при просмотре или сортировке. В конечном итоге, поскольку мы используем страничную разметку по умолчанию, ObjectDataSource извлек все записи при отображении первой страницы. Даже если GridView не предоставляет поддержку сортировки и разбиения на страницы, данные должны извлекаться из базы данных при каждом посещении страницы любым пользователем (и при каждом обратном просмотре, если состояние представления отключено). Но если GridView отображает одинаковые данные для всех пользователей, эти дополнительные запросы базы данных являются лишними. Почему бы не кэшировать результаты, возвращаемые методом GetProducts()
, и привязать GridView к этим кэшируемым результатам?
Шаг 4. Кэширование данных с помощью ObjectDataSource
Просто задав несколько свойств, ОбъектDataSource можно настроить для автоматического кэширования полученных данных в кэше данных ASP.NET. В следующем списке перечислены свойства, связанные с кэшем объекта ObjectDataSource:
- Необходимо установить параметр EnableCaching в значение
true
, чтобы включить кэширование. Значение по умолчанию —false
. -
CacheDuration — это продолжительность времени в секундах, на которой данные остаются в кэше. Значение по умолчанию — 0. ObjectDataSource будет кэшировать данные только в том случае, если
EnableCaching
равенtrue
, аCacheDuration
установлено в значение больше нуля. -
CacheExpirationPolicy можно задать как
Absolute
, так иSliding
. ЕслиAbsolute
объект ObjectDataSource кэширует полученные данные наCacheDuration
секунд; еслиSliding
, данные истекают только после того, как к ним не обращались в течениеCacheDuration
секунд. Значение по умолчанию —Absolute
. -
CacheKeyDependency использует это свойство для связывания записей кэша ObjectDataSource с существующей зависимостью кэша. Записи данных ObjectDataSource могут быть преждевременно вытеснены из кэша, если срок действия их связанного
CacheKeyDependency
истек. Это свойство чаще всего используется для связывания зависимости кэша SQL с кэшем ObjectDataSource. В будущем мы рассмотрим этот раздел с помощью руководства по зависимостям кэша SQL .
Настроим ProductsDataSource
ObjectDataSource, чтобы кэшировать данные на 30 секунд по абсолютной шкале. Задайте свойство EnableCaching
элемента ObjectDataSource и его свойство true
значением 30.
CacheExpirationPolicy
Оставьте свойство заданным по умолчаниюAbsolute
.
Рис. 11. Настройка ObjectDataSource для кэширования данных в течение 30 секунд (щелкните, чтобы просмотреть изображение полного размера)
Сохраните изменения и вернитесь на эту страницу в браузере. При первом посещении страницы появится текст о событии выбора, так как изначально данных нет в кэше. Но последующие обратные вызовы, активируемые путем нажатия кнопки "Обратная связь", сортировки, разбиения по страницам или нажатия кнопки "Изменить" или "Отмена", не отображают текст после срабатывания события выбора. Это связано с тем, что Selecting
событие запускается только в том случае, если объект ObjectDataSource получает данные из своего базового объекта; Selecting
событие не срабатывает, если данные извлекается из кэша данных.
Через 30 секунд данные будут вытесщены из кэша. Данные также будут вытеснены из кэша, если будут вызваны методы Insert
, Update
или Delete
объекта ObjectDataSource. Следовательно, после того как пройдут 30 секунд или будет нажата кнопка "Обновить", любые действия по сортировке, разбивке по страницам или нажатию кнопок "Изменить" или "Отмена" приведут к тому, что ObjectDataSource получит данные из своего базового объекта, отображая текст события "Selecting", когда произойдет событие Selecting
. Эти возвращаемые результаты помещаются обратно в кэш данных.
Замечание
Если текст о срабатывании события выбора появляется часто, даже когда вы ожидаете, что ObjectDataSource работает с кешированными данными, это может происходить из-за ограничений памяти. Если недостаточно свободной памяти, данные, добавленные в кэш ObjectDataSource, могли быть удалены. Если объект ObjectDataSource кажется, неправильно кэширует данные или кэширует данные время от времени, закройте некоторые приложения для освобождения памяти и повторите попытку снова.
На рисунке 12 показан рабочий процесс кэширования ObjectDataSource. Когда на экране отображается текст о срабатывании события выбора, это означает, что данные не были в кэше и должны были быть извлечены из базового объекта. Однако если этот текст отсутствует, это связано с тем, что данные были доступны из кэша. Когда данные возвращаются из кэша, вызов базового объекта отсутствует, поэтому запрос к базе данных не выполняется.
Рис. 12. ОбъектDataSource хранит и извлекает данные из кэша данных
Каждое приложение ASP.NET имеет собственный экземпляр кэша данных, общий доступ ко всем страницам и посетителям. Это означает, что данные, хранящиеся в кэше данных ObjectDataSource, также совместно используются для всех пользователей, посещающих страницу. Чтобы проверить это, откройте страницу ObjectDataSource.aspx
в браузере. При первом посещении страницы появится текст события "Событие выбора", при условии, что данные, добавленные в кэш предыдущими тестами, уже были вытеснены. Откройте второй экземпляр браузера и скопируйте и вставьте URL-адрес из первого экземпляра браузера во второй. Во втором экземпляре браузера текст о срабатывании события выбора не отображается, так как он использует те же кэшированные данные, что и первый.
При вставке полученных данных в кэш объект ObjectDataSource использует значение ключа кэша, включающее: значения свойств
Формирование значения ключа кэша на основе комбинации этих свойств гарантирует уникальную запись кэша по мере их изменения. Например, в предыдущих руководствах мы рассмотрели использование класса ProductsBLL
GetProductsByCategoryID(categoryID)
, который возвращает все товары для указанной категории. Один пользователь может прийти на страницу и просмотреть напитки, которые имеют CategoryID
значение 1. Если ObjectDataSource кэшировал свои результаты без учета значений SelectParameters
, и другой пользователь приходил на страницу, чтобы просмотреть кондименты, в то время как в кэше находились напитки, то он увидел бы кэшированные продукты напитков, а не кондименты. Изменяя ключ кэша с учетом этих свойств, которые включают значения SelectParameters
, ObjectDataSource поддерживает отдельную запись кэша для напитков и приправ.
Проблемы устаревших данных
ObjectDataSource автоматически вытесняет свои элементы из кэша при вызове любого из его методов Insert
, Update
или Delete
. Это помогает защитить от устаревших данных путем очистки записей кэша при изменении данных на странице. Однако для ObjectDataSource можно использовать кэширование для отображения устаревших данных. В самом простом случае это может быть связано с изменением данных непосредственно в базе данных. Возможно, администратор базы данных просто запустил скрипт, который изменяет некоторые записи в базе данных.
Этот сценарий также может развернуться более тонким образом. Хотя ObjectDataSource вытесняет элементы из кэша при вызове одного из методов изменения данных, кэшированные элементы удаляются для конкретного сочетания значений свойств ObjectDataSource (CacheDuration
, TypeName
, SelectMethod
и т. д.). Если у вас есть два объекта ObjectDataSource, которые используют разные SelectMethods
или SelectParameters
, но все еще могут обновлять одни и те же данные, то один ObjectDataSource может обновить строку и аннулировать свои собственные записи кэша, но соответствующая строка для второго ObjectDataSource по-прежнему будет обслуживаться из кэша. Я призываю вас создавать страницы для того, чтобы продемонстрировать эту функциональность. Создайте страницу, отображающую редактируемый GridView, который извлекает данные из ObjectDataSource, использующего кэширование и настроенный для получения данных из ProductsBLL
метода класса GetProducts()
. Добавьте еще один редактируемый GridView и ObjectDataSource на эту страницу (или другую), но для второго экземпляра ObjectDataSource используйте метод GetProductsByCategoryID(categoryID)
. Так как два свойства ObjectDataSources SelectMethod
отличаются, они будут иметь собственные кэшированные значения. Если вы редактируете продукт в одной сетке, при следующей привязке данных к другой сетке (путем разбиения по страницам, сортировке и т. д.), она по-прежнему будет предоставлять старые кэшированные данные и не отражать изменения, внесенные в другой сетке.
Короче говоря, используйте только срок действия на основе времени, если вы готовы иметь потенциал устаревших данных и использовать более короткие сроки действия для сценариев, когда актуальность данных важна. Если устаревшие данные недопустимы, либо откажитесь от кэширования, либо используйте зависимости кэша SQL (если вы кэшируете данные из базы данных). В будущем мы рассмотрим зависимости кэша SQL.
Сводка
В этом руководстве мы изучили встроенные возможности кэширования ObjectDataSource. Просто задав несколько свойств, мы можем указать ObjectDataSource кэшировать результаты, возвращаемые из указанного SelectMethod
в кэше данных ASP.NET. Свойства CacheDuration
и CacheExpirationPolicy
указывают длительность кэширования элемента и то, является ли срок действия абсолютным или скользящим. Свойство CacheKeyDependency
связывает все записи кэша ObjectDataSource с существующей зависимостью кэша. Это можно использовать для вытеснения записей ObjectDataSource из кэша до истечения срока действия, основанного на времени, и обычно применяется с зависимостями кэша SQL.
Так как ObjectDataSource просто кэширует значения в кэш данных, мы можем реплицировать встроенные функции ObjectDataSource программным способом. Это не имеет смысла делать на уровне слоя презентации, так как ObjectDataSource предлагает эту возможность из коробки, но мы можем реализовать возможности кэширования в отдельном слое архитектуры. Для этого необходимо повторить ту же логику, используемую ObjectDataSource. Мы рассмотрим, как программно работать с кэшем данных из архитектуры в следующем руководстве.
Счастливое программирование!
Дальнейшее чтение
Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:
- кэширование ASP.NET: методы и рекомендации
- Руководство по кэшированию архитектуры для приложений .NET Framework
Сведения о авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Самоучитель по ASP.NET 2.0 за 24 часа. С ним можно связаться по адресу mitchell@4GuysFromRolla.com.
Особое спасибо кому
Эта серия учебников была проверена многими полезными рецензентами. Ведущий рецензент этого руководства — Тереса Мерфи. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.