Кэширование данных с помощью ObjectDataSource (VB)
Кэширование может означать разницу между медленным и быстрым веб-приложением. Этот учебник является первым из четырех, где подробно рассматривается кэширование в 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.
Шаг 1. Создание кэширования веб-страниц
Прежде чем мы приступим к изучению функций кэширования ObjectDataSource, давайте сначала уделим немного времени, чтобы создать страницы ASP.NET в проекте веб-сайта, которые понадобятся нам для этого руководства и следующих трех. Начните с добавления новой папки с именем Caching
. Затем добавьте в нее следующие страницы ASP.NET, обязательно свяжите каждую страницу со страницей Site.master
master:
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
Рис. 1. Добавление страниц ASP.NET для учебников по Caching-Related
Как и в других папках, Default.aspx
в папке Caching
будет отображаться список учебников в своем разделе. Помните, что SectionLevelTutorialListing.ascx
пользовательский элемент управления предоставляет эту функцию. Поэтому добавьте этот пользовательский элемент управления в , Default.aspx
перетащив его из Обозреватель решений в режим конструктора страницы.
Рис. 2. Рис. 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 с панели элементов на Designer, задайте для его ID
свойства Products
значение и из смарт-тега привяжите его к новому элементу управления ObjectDataSource с именем ProductsDataSource
. Настройте ObjectDataSource для работы с классом ProductsBLL
.
Рис. 4. Настройка ObjectDataSource для использования ProductsBLL
класса (щелкните для просмотра полноразмерного изображения)
Для этой страницы создадим редактируемый GridView, чтобы мы могли проверить, что происходит при изменении данных, кэшированных в ObjectDataSource, с помощью интерфейса GridView. Оставьте для раскрывающегося списка на вкладке SELECT значение по умолчанию , GetProducts()
но измените выбранный элемент на вкладке UPDATE на перегрузку UpdateProduct
, которая принимает productName
, unitPrice
и productID
в качестве входных параметров.
Рис. 5. Задайте для Drop-Down списка Drop-Down вкладки UPDATE соответствующую UpdateProduct
перегрузку (щелкните для просмотра полноразмерного изображения)
Наконец, задайте для раскрывающихся списков на вкладках INSERT и DELETE значение (Нет) и нажмите кнопку Готово. После завершения работы мастера настройки источника данных Visual Studio задает свойству original_{0}
ObjectDataSource значение OldValuesParameterFormatString
. Как описано в руководстве Общие сведения о вставке, обновлении и удалении данных , это свойство необходимо удалить из декларативного синтаксиса или вернуть значение по умолчанию , {0}
чтобы рабочий процесс обновления продолжался без ошибок.
Кроме того, по завершении работы мастера Visual Studio добавляет поле в GridView для каждого поля данных о продукте. Удалите все поля ProductName
, кроме , CategoryName
и UnitPrice
BoundFields. Затем обновите HeaderText
свойства каждого из этих полей BoundFields на Product, Category и Price соответственно. ProductName
Так как поле является обязательным, преобразуйте BoundField в TemplateField и добавьте RequiredFieldValidator в EditItemTemplate
. Аналогичным образом преобразуйте UnitPrice
BoundField в TemplateField и добавьте CompareValidator, чтобы убедиться, что введенное пользователем значение является допустимым значением валюты, которое больше или равно нулю. Помимо этих изменений, вы можете вносить любые эстетические изменения, например выравнивание значения по правому краю UnitPrice
или указание форматирования текста в интерфейсах только для UnitPrice
чтения и редактирования.
Сделайте GridView редактируемым, установив флажок Включить редактирование в смарт-теге GridView. Кроме того, проверка флажки Включить разбиение по страницам и Включить сортировку.
Примечание
Хотите ознакомиться с настройкой интерфейса редактирования GridView? Если да, вернитесь к руководству По настройке интерфейса изменения данных .
Рис. 6. Включение поддержки GridView для редактирования, сортировки и разбиения по страницам (щелкните для просмотра полноразмерного изображения)
После внесения этих изменений в 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 запрашивает данные
GridView Products
получает свои данные для отображения путем вызова 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()
метод .
Чтобы в полной мере оценить частоту получения данных из базы данных, давайте выведем сообщение, указывающее, когда данные извлекаются повторно. Добавьте веб-элемент управления Метка над GridView с именем ODSEvents
. Очистите его Text
свойство и задайте для него EnableViewState
значение False
. Под меткой добавьте веб-элемент управления Button и задайте для его Text
свойства значение Postback .
Рис. 8. Добавление метки и кнопки на страницу над GridView (щелкните для просмотра полноразмерного изображения)
Во время рабочего процесса доступа к данным событие ObjectDataSource Selecting
срабатывает перед созданием базового объекта и вызовом настроенного метода. Создайте обработчик событий для этого события и добавьте следующий код:
Protected Sub ProductsDataSource_Selecting(sender As Object, _
e As ObjectDataSourceSelectingEventArgs) _
Handles ProductsDataSource.Selecting
ODSEvents.Text = "-- Selecting event fired"
End Sub
Каждый раз, когда ObjectDataSource отправляет запрос к архитектуре данных, метка будет отображать текст Selecting событие .
Посетите эту страницу в браузере. При первом посещении страницы отображается текст Выбор активированного события. Нажмите кнопку Обратной передачи и обратите внимание, что текст исчезает (при условии, что свойству GridView задано EnableViewState
значение True
по умолчанию). Это связано с тем, что при обратной отправке GridView восстанавливается из состояния представления и, следовательно, не поворачивается к ObjectDataSource для своих данных. Однако сортировка, разбиение на страницы или изменение данных приводит к повторной привязке GridView к источнику данных, и, следовательно, возникает событие Selecting, вызванное текстовым событием.
Рис. 9. Всякий раз, когда GridView возвращается к источнику данных, отображается событие Selecting (Щелкните для просмотра полноразмерного изображения)
Рис. 10. Нажатие кнопки обратной передачи приводит к восстановлению GridView из состояния представления (щелкните для просмотра полноразмерного изображения)
Извлечение данных базы данных каждый раз, когда данные выстраивать или сортироваться по страницам, может показаться расточительным. В конце концов, так как мы повторно используем разбиение по умолчанию, ObjectDataSource извлек все записи при отображении первой страницы. Даже если GridView не поддерживает сортировку и разбиение на страницы, данные должны извлекаться из базы данных каждый раз, когда любой пользователь впервые посещает страницу (и при каждой обратной отправке, если состояние представления отключено). Но если GridView отображает одни и те же данные для всех пользователей, эти дополнительные запросы базы данных являются лишними. Почему бы не кэшировать результаты, возвращенные методом GetProducts()
, и не привязать GridView к кэшируемым результатам?
Шаг 4. Кэширование данных с помощью ObjectDataSource
Просто задав несколько свойств, объект ObjectDataSource можно настроить для автоматического кэширования полученных данных в кэше данных ASP.NET. В следующем списке перечислены связанные с кэшем свойства ObjectDataSource:
- Чтобы включить кэширование, необходимо присвоить параметру
True
EnableCaching значение . Значение по умолчанию —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 секунд в абсолютном масштабе. Присвойте свойству ObjectDataSource EnableCaching
значение , True
а его CacheDuration
свойству — значение 30. CacheExpirationPolicy
Оставьте для свойства значение по умолчанию . Absolute
Рис. 11. Настройка ObjectDataSource для кэширования данных в течение 30 секунд (щелкните для просмотра полноразмерного изображения)
Сохраните изменения и вернитесь на эту страницу в браузере. При первом посещении страницы появится текст Выбор события, так как изначально данные отсутствуют в кэше. Но последующие обратные передачи, активируемые нажатием кнопки Обратной передачи, сортировки, разбиения по страницам или нажатием кнопок Изменить или Отмена, не перезаписывают текст, вызванный событием Selecting. Это связано с тем Selecting
, что событие срабатывает только тогда, когда ObjectDataSource получает данные из своего базового объекта; Selecting
событие не срабатывает, если данные извлекается из кэша данных.
Через 30 секунд данные будут исключены из кэша. Данные также будут исключены из кэша при вызове методов ObjectDataSource Insert
, Update
или Delete
. Следовательно, по истечении 30 секунд или нажатии кнопки Обновить, сортировка, разбиение по страницам или нажатие кнопок Изменить или Отмена приведет к тому, что ObjectDataSource будет получать данные из своего базового объекта, отображая текст Выбор события, сработав при Selecting
возникновении события. Эти возвращаемые результаты помещаются обратно в кэш данных.
Примечание
Если событие Selecting отображается часто, даже если предполагается, что ObjectDataSource будет работать с кэшируемыми данными, это может быть связано с ограничениями памяти. Если недостаточно свободной памяти, данные, добавленные ObjectDataSource в кэш, могут быть очищены. Если ObjectDataSource не выполняет правильное кэширование данных или кэширует данные только периодически, закройте некоторые приложения, чтобы освободить память, и повторите попытку.
На рисунке 12 показан рабочий процесс кэширования ObjectDataSource. Когда на экране появляется текст , вызванный событием Selecting, это связано с тем, что данные не находились в кэше и должны были быть извлечены из базового объекта. Однако если этот текст отсутствует, это связано с тем, что данные были доступны из кэша. Когда данные возвращаются из кэша, вызов базового объекта и, следовательно, запрос к базе данных не выполняется.
Рис. 12. ObjectDataSource хранит и извлекает данные из кэша данных
Каждое приложение ASP.NET имеет собственный экземпляр кэша данных, который используется для всех страниц и посетителей. Это означает, что данные, хранящиеся в кэше данных ObjectDataSource, также совместно используются всеми пользователями, которые посещают страницу. Чтобы проверить это, откройте страницу ObjectDataSource.aspx
в браузере. При первом посещении страницы появится сработавшее событие Selecting (предполагается, что данные, добавленные в кэш предыдущими тестами, к настоящему времени были исключены). Откройте второй экземпляр браузера и скопируйте и вставьте URL-адрес из первого экземпляра браузера во второй. Во втором экземпляре браузера не отображается активированный текст события Selecting, так как он использует те же кэшированные данные, что и первый.
При вставке полученных данных в кэш ObjectDataSource использует значение ключа кэша, включающее: CacheDuration
значения свойств и CacheExpirationPolicy
; тип базового бизнес-объекта, используемого ObjectDataSource, который указывается с помощью TypeName
свойства (ProductsBLL
в этом примере); значение SelectMethod
свойства, имя и значения параметров в SelectParameters
коллекции; а также значения его StartRowIndex
свойств и MaximumRows
. которые используются при реализации пользовательского разбиения по страницам.
Создание значения ключа кэша как сочетания этих свойств обеспечивает уникальную запись кэша при изменении этих значений. Например, в предыдущих руководствах мы рассмотрели использование ProductsBLL
класса s 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
метода класса s 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
Об авторе
Скотт Митчелл (Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с Веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часа. Его можно связать по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.
Отдельная благодарность
Эта серия учебников была проверена многими полезными рецензентами. Ведущим рецензентом этого руководства была Тереса Мерфи. Хотите ознакомиться с моими предстоящими статьями MSDN? Если да, опустите мне строку в mitchell@4GuysFromRolla.com.