본문 바로가기

Programming/ASP .NET

SQL 캐시 종속성과 WebUserControl을 이용한 캐싱 방법


목표

 페이지 내에서 SQL SERVER의 특정 테이블의 내용이 변경될 때만 해당 테이블을 표현하는 컨트롤을 다시 파싱하여 읽고 싶다. 이외의 다른 컨트롤들은 테이블 변경과 상관없이 다시 파싱하게 한다.

준비

  1. 사용하는 데이터베이스가 캐싱이 가능하게 만들어 줘야한다.
  2. web.config에 캐싱 관련 코드를 입력해야한다.

1. 데이터베이스가 캐싱이 가능하게 등록

Visual Studio 2005 Command Prompt에서 다음과 같이 입력

==== DB를 캐싱 가능하게 등록 ====

aspnet_regsql -S "." -U "UserID" -P "UserPassword" -d "DBName" -ed

>> DB에 AspNet_SqlCacheTablesForChangeNotification 테이블이 생성됨

==== 테이블을 캐싱 가능하게 등록 ====

aspnet_regsql -S "." -U "UserID" -P "UserPassword" -d "DBName" -et -t "TableName"

>> AspNet_SqlCacheTablesForChangeNotification 테이블에 TableName 테이블 관련 정보가 추가됨

2. web.config에 캐싱 관련 코드 입력

<system.web>
    <caching>
       <sqlCacheDependency enabled="true" pollTime="1000">
        <databases>
         <add name="DBName" connectionStringName="ConnectionStringName" />
        </databases>
       </sqlCacheDependency>
    </caching>
</system.web>

시작

WebUserControl 생성

1. Add New Item -> Web User Control 추가
2. 생성된 ascx 소스에서 상단에 다음 코드 추가

<%@ OutputCache Duration="999999" SqlDependency="DBName:TableName" VaryByParam="none" %>


WebPage에 WebUserControl 삽입

1. aspx 소스 상단에 다음 코드 추가

<%@ Register Src="FileName.ascx" TagName="TagName" TagPrefix="uc1" %>

2. 적당한 위치에 WebUserControl 삽입

<uc1:TagName ID="UserControlID" runat="server" />


테스트

1. TableName에 INSERT, DELETE, UPDATE와 같은 쿼리가 수행이 되면
AspNet_SqlCacheTablesForChangeNotification 테이블에 changID 필드의 값이 변경됨

2. WebUserControl 페이지에 라벨을 하나 추가하고 Page_Load에 다음 코드 삽입

   [각주:1]Label1.Text = System.DateTime.Now.ToString();


3. 브라우저에서 aspx 페이지를 읽으면 현재 시간이 찍힌다. 하지만 F5든 CTRL+F5든 눌러서 새로고침을 해도 그 시간은 바뀌지 않는다. 즉 새로 파싱을 하는 것이 아니라 캐싱된 페이지를 그대로 읽는 것이다.

4. 캐싱으로 연결된 테이블의 내용을 변경하고 F5를 눌러 새로고침을 하면 시간이 업데이트 된다.

  1. 만약 페이지가 새로 파싱이 되면 시간이 변경될 것이다. [본문으로]