ObjectDataSource를 사용하여 데이터 캐싱(C#)
작성자 : Scott Mitchell
캐싱은 느린 웹 애플리케이션과 빠른 웹 애플리케이션 간의 차이를 의미할 수 있습니다. 이 자습서는 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 페이지를 추가하여 각 페이지를 master 페이지와 Site.master
연결해야 합니다.
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
그림 1: Caching-Related 자습서에 대한 ASP.NET 페이지 추가
다른 폴더와 Default.aspx
마찬가지로 폴더의 Caching
섹션에 자습서가 나열됩니다. 사용자 컨트롤은 SectionLevelTutorialListing.ascx
이 기능을 제공합니다. 따라서 솔루션 탐색기 페이지의 디자인 보기로 끌어 이 사용자 컨트롤 Default.aspx
을 에 추가합니다.
그림 2: 그림 2: 사용자 정의 컨트롤을 에 Default.aspx
추가 SectionLevelTutorialListing.ascx
합니다(전체 크기 이미지를 보려면 클릭).
마지막으로 이러한 페이지를 파일에 항목으로 추가합니다 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를 사용하여 클래스에서 ProductsBLL
ObjectDataSource에서 검색한 제품 정보를 나열하는 웹 페이지를 만들어 보겠습니다.
먼저 폴더에서 ObjectDataSource.aspx
Caching
페이지를 엽니다. Toolbox에서 Designer GridView를 끌어와 속성을 ID
Products
로 설정하고 스마트 태그에서 라는 ProductsDataSource
새 ObjectDataSource 컨트롤에 바인딩하도록 선택합니다. 클래스와 함께 작동하도록 ObjectDataSource를 구성합니다 ProductsBLL
.
그림 4: 클래스를 사용하도록 ProductsBLL
ObjectDataSource 구성(전체 크기 이미지를 보려면 클릭)
이 페이지에서는 ObjectDataSource에 캐시된 데이터가 GridView의 인터페이스를 통해 수정될 때 발생하는 작업을 검사할 수 있도록 편집 가능한 GridView를 만들어 보겠습니다. SELECT 탭의 드롭다운 목록을 기본값으로 GetProducts()
설정하지만 UPDATE 탭 UpdateProduct
에서 선택한 항목을 입력 매개 변수로 , 및 unitPrice
productID
를 허용하는 productName
오버로드로 변경합니다.
그림 5: UPDATE Tab의 Drop-Down 목록을 적절한 UpdateProduct
오버로드로 설정합니다(전체 크기 이미지를 보려면 클릭).
마지막으로 INSERT 및 DELETE 탭의 드롭다운 목록을 (없음)으로 설정하고 마침을 클릭합니다. 데이터 원본 구성 마법사를 완료하면 Visual Studio에서 ObjectDataSource의 OldValuesParameterFormatString
속성을 original_{0}
로 설정합니다. 데이터 삽입, 업데이트 및 삭제 개요 자습서에서 설명한 대로 이 속성은 선언적 구문에서 제거하거나 기본값인 {0}
로 다시 설정해야 업데이트 워크플로가 오류 없이 진행됩니다.
또한 마법사가 완료되면 Visual Studio는 각 제품 데이터 필드에 대한 필드를 GridView에 추가합니다. , CategoryName
및 UnitPrice
BoundFields를 ProductName
제외한 모든 를 제거합니다. 다음으로, 이러한 각 BoundFields의 속성을 각각 Product, Category 및 Price로 업데이트 HeaderText
합니다. 필드가 ProductName
필요하므로 BoundField를 TemplateField로 변환하고 RequiredFieldValidator를 에 EditItemTemplate
추가합니다. 마찬가지로 BoundField를 UnitPrice
TemplateField로 변환하고 CompareValidator를 추가하여 사용자가 입력한 값이 0보다 크거나 같은 유효한 통화 값인지 확인합니다. 이러한 수정 외에도 값을 오른쪽 맞춤 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
ObjectDataSource의 ProductsDataSource
메서드를 호출하여 Select
표시할 데이터를 검색합니다. 이 ObjectDataSource는 비즈니스 논리 계층 클래스의 ProductsBLL
instance 만들고 메서드를 GetProducts()
호출합니다. 이 메서드는 데이터 액세스 계층의 ProductsTableAdapter
GetProducts()
메서드를 호출합니다. DAL 메서드는 Northwind 데이터베이스에 연결하고 구성된 SELECT
쿼리를 발급합니다. 그런 다음 이 데이터는 DAL로 반환되어 에서 NorthwindDataTable
패키지됩니다. DataTable 개체는 BLL로 반환되며, 이를 ObjectDataSource로 반환하여 GridView로 반환합니다. 그런 다음 GridView는 DataTable에서 각각 DataRow
에 대한 개체를 만들고GridViewRow
, 각 GridViewRow
개체는 결국 클라이언트에 반환되고 방문자 브라우저에 표시되는 HTML로 렌더링됩니다.
이 이벤트 시퀀스는 GridView가 기본 데이터에 바인딩해야 할 때마다 발생합니다. 페이지가 처음 방문되거나, 데이터의 한 페이지에서 다른 페이지로 이동하거나, GridView를 정렬할 때 또는 기본 제공 편집 또는 삭제 인터페이스를 통해 GridView의 데이터를 수정할 때 발생합니다. GridView의 뷰 상태를 사용하지 않도록 설정하면 GridView는 모든 포스트백에서도 반등합니다. GridView는 메서드를 호출하여 데이터에 명시적으로 다시 설정할 수도 있습니다 DataBind()
.
데이터베이스에서 데이터를 검색하는 빈도를 충분히 평가하려면 데이터가 다시 검색되는 시기를 나타내는 메시지를 표시해 보겠습니다. 라는 ODSEvents
GridView 위에 레이블 웹 컨트롤을 추가합니다. 속성을 지우고 속성을 Text
EnableViewState
false
로 설정합니다. 레이블 아래에 Button Web 컨트롤을 추가하고 해당 Text
속성을 Postback 로 설정합니다.
그림 8: GridView 위의 페이지에 레이블 및 단추 추가(전체 크기 이미지를 보려면 클릭)
데이터 액세스 워크플로 중에 기본 개체가 만들어지고 구성된 메서드가 호출되기 전에 ObjectDataSource 이벤트가 Selecting
발생합니다. 이 이벤트에 대한 이벤트 처리기를 만들고 다음 코드를 추가합니다.
protected void ProductsDataSource_Selecting(object sender,
ObjectDataSourceSelectingEventArgs e)
{
ODSEvents.Text = "-- Selecting event fired";
}
ObjectDataSource가 데이터에 대한 아키텍처를 요청할 때마다 레이블에 실행된 Selecting 이벤트 텍스트가 표시됩니다.
브라우저에서 이 페이지를 방문하세요. 페이지를 처음 방문하면 이벤트 선택 텍스트가 표시됩니다. 포스트백 단추를 클릭하고 텍스트가 사라집니다(GridView의 EnableViewState
속성이 기본값인 로 true
설정되어 있다고 가정). 포스트백 시 GridView가 뷰 상태에서 재구성되므로 데이터에 대한 ObjectDataSource로 전환되지 않기 때문입니다. 그러나 데이터를 정렬, 페이징 또는 편집하면 GridView가 해당 데이터 원본에 다시 바인딩되므로 Selecting 이벤트가 발생한 텍스트가 다시 나타납니다.
그림 9: GridView가 해당 데이터 원본으로 리바운드될 때마다 발생한 이벤트 선택 표시됨(전체 크기 이미지를 보려면 클릭)
그림 10: 포스트백 단추를 클릭하면 GridView가 뷰 상태에서 재구성됩니다(전체 크기 이미지를 보려면 클릭).
데이터가 페이징되거나 정렬될 때마다 데이터베이스 데이터를 검색하는 것은 낭비되는 것처럼 보일 수 있습니다. 결국 기본 페이징을 사용하므로 ObjectDataSource는 첫 번째 페이지를 표시할 때 모든 레코드를 검색했습니다. GridView에서 정렬 및 페이징 지원을 제공하지 않더라도 모든 사용자가 페이지를 처음 방문할 때마다 데이터베이스에서 데이터를 검색해야 합니다(보기 상태가 비활성화된 경우 모든 포스트백에서). 그러나 GridView가 모든 사용자에게 동일한 데이터를 표시하는 경우 이러한 추가 데이터베이스 요청은 불필요합니다. 메서드에서 GetProducts()
반환된 결과를 캐시하고 GridView를 캐시된 결과에 바인딩하지 않는 이유는 무엇인가요?
4단계: ObjectDataSource를 사용하여 데이터 캐싱
몇 가지 속성을 설정하기만 하면 검색된 데이터를 ASP.NET 데이터 캐시에 자동으로 캐시하도록 ObjectDataSource를 구성할 수 있습니다. 다음 목록에는 ObjectDataSource의 캐시 관련 속성이 요약되어 있습니다.
- 캐싱을 사용하도록 설정하려면 EnableCaching을 로
true
설정해야 합니다. 기본값은false
입니다. - CacheDuration 데이터가 캐시되는 시간(초)입니다. 기본값은 0입니다. ObjectDataSource는 가
true
이고CacheDuration
가 0보다 큰 값으로 설정된 경우에만EnableCaching
데이터를 캐시합니다. - CacheExpirationPolicy는 또는
Sliding
로Absolute
설정할 수 있습니다. 이면Absolute
ObjectDataSource는 검색된 데이터를 초 동안CacheDuration
캐시합니다. 이면Sliding
데이터가 몇 초 동안CacheDuration
액세스되지 않은 후에만 만료됩니다. 기본값은Absolute
입니다. - CacheKeyDependency 는 이 속성을 사용하여 ObjectDataSource의 캐시 항목을 기존 캐시 종속성과 연결합니다. ObjectDataSource의 데이터 항목은 연결된
CacheKeyDependency
를 만료하여 캐시에서 조기에 제거될 수 있습니다. 이 속성은 SQL 캐시 종속성을 ObjectDataSource 캐시와 연결하는 데 가장 일반적으로 사용되며, 나중에 SQL Cache 종속성 사용 자습서에서 살펴볼 항목입니다.
절대 크기 조정에서 ProductsDataSource
30초 동안 데이터를 캐시하도록 ObjectDataSource를 구성해 보겠습니다. ObjectDataSource의 EnableCaching
속성을 true
로 설정하고 해당 CacheDuration
속성을 30으로 설정합니다. CacheExpirationPolicy
속성을 기본값Absolute
인 로 설정합니다.
그림 11: ObjectDataSource를 구성하여 데이터를 30초 동안 캐시합니다(전체 크기 이미지를 보려면 클릭).
변경 내용을 저장하고 브라우저에서 이 페이지를 다시 방문합니다. 처음에 데이터가 캐시에 없기 때문에 처음 페이지를 방문할 때 Selecting 이벤트 발생 텍스트가 표시됩니다. 그러나 포스트백 단추를 클릭하거나, 정렬, 페이징 또는 편집 또는 취소 단추를 클릭하여 트리거된 후속 포스트백은 Selecting 이벤트가 발생한 텍스트를 다시 표시 하지 않습니다. 이는 ObjectDataSource가 기본 개체 Selecting
에서 해당 데이터를 가져올 때만 이벤트가 실행되기 때문 Selecting
입니다. 데이터가 데이터 캐시에서 가져온 경우 이벤트가 발생하지 않기 때문입니다.
30초 후에는 캐시에서 데이터가 제거됩니다. ObjectDataSource의 Insert
, Update
또는 Delete
메서드가 호출되는 경우에도 캐시에서 데이터가 제거됩니다. 따라서 30초가 지났거나 업데이트 단추를 클릭, 정렬, 페이징 또는 편집 또는 취소 단추를 클릭하면 ObjectDataSource가 기본 개체에서 해당 데이터를 가져오고 이벤트가 발생할 때 Selecting
Selecting 이벤트가 발생한 텍스트를 표시합니다. 이러한 반환된 결과는 데이터 캐시에 다시 배치됩니다.
참고
ObjectDataSource가 캐시된 데이터로 작동할 것으로 예상하는 경우에도 Selecting 이벤트가 자주 발생한 텍스트가 표시되는 경우 메모리 제약 조건으로 인한 것일 수 있습니다. 사용 가능한 메모리가 충분하지 않은 경우 ObjectDataSource가 캐시에 추가한 데이터가 삭제되었을 수 있습니다. ObjectDataSource가 데이터를 올바르게 캐싱하지 않거나 데이터를 산발적으로 캐시하는 경우 일부 애플리케이션을 닫아 메모리를 해제하고 다시 시도합니다.
그림 12에서는 ObjectDataSource의 캐싱 워크플로를 보여 줍니다. Selecting 이벤트가 발생한 텍스트가 화면에 나타나면 데이터가 캐시에 있지 않고 기본 개체에서 검색되어야 했기 때문입니다. 그러나 이 텍스트가 누락된 경우 캐시에서 데이터를 사용할 수 있었기 때문입니다. 캐시에서 데이터가 반환되면 기본 개체에 대한 호출이 없으므로 데이터베이스 쿼리가 실행되지 않습니다.
그림 12: ObjectDataSource는 데이터 캐시에서 해당 데이터를 저장하고 검색합니다.
각 ASP.NET 애플리케이션에는 모든 페이지와 방문자 간에 공유되는 자체 데이터 캐시 instance 있습니다. 즉, ObjectDataSource에 의해 데이터 캐시에 저장된 데이터도 페이지를 방문하는 모든 사용자 간에 공유됩니다. 이를 확인하려면 브라우저에서 페이지를 엽니다 ObjectDataSource.aspx
. 페이지를 처음 방문하면 Selecting 이벤트 발생 텍스트가 표시됩니다(이전 테스트에 의해 캐시에 추가된 데이터가 지금까지 제거되었다고 가정). 두 번째 브라우저 instance 열고 첫 번째 브라우저 instance URL을 복사하여 두 번째 브라우저에 붙여넣습니다. 두 번째 브라우저 instance 첫 번째와 동일한 캐시된 데이터를 사용하므로 Selecting 이벤트 발생 텍스트가 표시되지 않습니다.
검색된 데이터를 캐시에 삽입할 때 ObjectDataSource는 및 CacheExpirationPolicy
속성 값, 속성을 통해 TypeName
지정되는 ObjectDataSource에서 사용하는 기본 비즈니스 개체의 형식,ProductsBLL
속성 값, 컬렉션에 있는 매개 변수 SelectParameters
의 SelectMethod
이름 및 값, 해당 및 MaximumRows
속성 값을 StartRowIndex
포함하는 CacheDuration
캐시 키 값을 사용합니다. 사용자 지정 페이징을 구현할 때 사용되는 입니다.
이러한 속성의 조합으로 캐시 키 값을 만들면 이러한 값이 변경될 때 고유한 캐시 항목이 보장됩니다. 예를 들어 이전 자습서에서는 지정된 범주에 ProductsBLL
대한 모든 제품을 반환하는 클래스의 GetProductsByCategoryID(categoryID)
를 사용하는 것을 살펴보았습니다. 한 사용자가 페이지에 와서 음료가 1인 CategoryID
음료를 볼 수 있습니다. ObjectDataSource가 값과 관계없이 SelectParameters
결과를 캐시한 경우 다른 사용자가 음료 제품이 캐시에 있는 동안 조미료를 보기 위해 페이지에 왔을 때 조미료가 아닌 캐시된 음료 제품을 볼 수 있습니다. 의 값을 SelectParameters
포함하는 이러한 속성에 따라 캐시 키를 변경하여 ObjectDataSource는 음료 및 보조에 대해 별도의 캐시 항목을 유지 관리합니다.
부실 데이터 문제
ObjectDataSource는 , Update
또는 Delete
메서드 중 하나가 호출될 때 캐시에서 해당 Insert
항목을 자동으로 제거합니다. 이렇게 하면 페이지를 통해 데이터를 수정할 때 캐시 항목을 지워 부실 데이터로부터 보호할 수 있습니다. 그러나 캐싱을 사용하는 ObjectDataSource가 부실 데이터를 계속 표시할 수 있습니다. 가장 간단한 경우 데이터베이스 내에서 데이터가 직접 변경되기 때문일 수 있습니다. 아마도 데이터베이스 관리자는 데이터베이스의 일부 레코드를 수정하는 스크립트를 실행했을 수 있습니다.
이 시나리오는 더 미묘한 방식으로 전개 될 수도 있습니다. ObjectDataSource는 데이터 수정 방법 중 하나가 호출될 때 캐시에서 해당 항목을 제거하지만, 제거된 캐시된 항목은 ObjectDataSource의 특정 속성 값 조합(CacheDuration
, , TypeName
SelectMethod
등)에 대한 것입니다. 다른 SelectMethods
또는 SelectParameters
를 사용하지만 동일한 데이터를 업데이트할 수 있는 ObjectDataSource가 두 개 있는 경우 하나의 ObjectDataSource가 행을 업데이트하고 자체 캐시 항목을 무효화할 수 있지만 두 번째 ObjectDataSource에 해당하는 행은 캐시된 에서 계속 제공됩니다. 이 기능을 나타내는 페이지를 만드는 것이 좋습니다. 캐싱을 사용하고 클래스의 GetProducts()
메서드에서 데이터를 가져오도록 구성된 ObjectDataSource에서 해당 데이터를 가져오는 편집 가능한 GridView를 ProductsBLL
표시하는 페이지를 만듭니다. 편집 가능한 다른 GridView 및 ObjectDataSource를 이 페이지(또는 다른 페이지)에 추가하지만 이 두 번째 ObjectDataSource의 경우 메서드를 GetProductsByCategoryID(categoryID)
사용합니다. 두 ObjectDataSources 속성은 SelectMethod
다르므로 각각 고유한 캐시된 값을 갖습니다. 한 그리드에서 제품을 편집하는 경우 다음에 데이터를 다른 그리드에 다시 바인딩할 때(페이징, 정렬 등) 다른 그리드에서 변경된 내용을 반영하지 않고 캐시된 이전 데이터를 계속 제공합니다.
즉, 부실 데이터의 잠재력을 갖고자 하는 경우에만 시간 기반 만료를 사용하고 데이터의 새로 고침이 중요한 시나리오에 더 짧은 만료를 사용합니다. 부실 데이터가 허용되지 않는 경우 캐싱을 포기하거나 SQL 캐시 종속성을 사용합니다(캐싱하는 데이터베이스 데이터라고 가정). 이후 자습서에서는 SQL 캐시 종속성을 살펴보겠습니다.
요약
이 자습서에서는 ObjectDataSource의 기본 제공 캐싱 기능을 살펴보었습니다. 몇 가지 속성을 설정하기만 하면 ObjectDataSource에 지정된 에서 반환된 SelectMethod
결과를 ASP.NET 데이터 캐시에 캐시하도록 지시할 수 있습니다. 및 CacheExpirationPolicy
속성은 CacheDuration
항목이 캐시되는 기간과 절대 만료 또는 슬라이딩 만료 여부를 나타냅니다. 속성은 CacheKeyDependency
모든 ObjectDataSource의 캐시 항목을 기존 캐시 종속성과 연결합니다. 이는 시간 기반 만료에 도달하기 전에 캐시에서 ObjectDataSource의 항목을 제거하기 위해 사용할 수 있으며 일반적으로 SQL 캐시 종속성과 함께 사용됩니다.
ObjectDataSource는 단순히 해당 값을 데이터 캐시에 캐시하므로 ObjectDataSource의 기본 제공 기능을 프로그래밍 방식으로 복제할 수 있습니다. ObjectDataSource는 이 기능을 기본 제공하지만 아키텍처의 별도 계층에서 캐싱 기능을 구현할 수 있으므로 프레젠테이션 계층에서 이 작업을 수행하는 것은 의미가 없습니다. 이렇게 하려면 ObjectDataSource에서 사용하는 것과 동일한 논리를 반복해야 합니다. 다음 자습서에서는 아키텍처 내에서 프로그래밍 방식으로 데이터 캐시를 작업하는 방법을 살펴보겠습니다.
행복한 프로그래밍!
추가 정보
이 자습서에서 설명하는 topics 대한 자세한 내용은 다음 리소스를 참조하세요.
저자 정보
7개의 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술로 작업해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 티치 유어셀프 ASP.NET 24시간 만에 2.0입니다. 그는 에서mitchell@4GuysFromRolla.com 또는 에서 찾을 http://ScottOnWriting.NET수있는 자신의 블로그를 통해 도달 할 수 있습니다.
특별 감사
이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 테레사 머피였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 에 줄을 놓습니다 mitchell@4GuysFromRolla.com.