SqlCacheDependency를 이용한 ASP 캐시

SqlCacheDependency를 이용한 ASP 캐시는 사전 저장 기능을 이용해 MSSQL로부터 데이터를 사전에 웹 서버의 메모리에 가져와 처리하는 데이터베이스의 부하 분산 처리가 가능한 기술이다.

SqlCacheDependency를 이용한 ASP 캐시

[그림 1] MSSQL Cache dependency 처리 흐름

위 그림과 같이 ASP에서 제공하는 캐시 기능은 2가지 기능을 제공하는데, 하나는 타임 방식과 이벤트 방식으로 특정 시간마다 캐시 내용을 이벤트 트리거를 이용하여, 데이터 변경이 일어났을시 이를 알려 항상 최신의 캐시 데이터를 유지할 수 있다.

이 기술은 SQL 접근에 대한 부하를 줄이는 동시에 처리를 위해 SQL을 거치지 않기 때문에 빠른 응답 속도를 가진다. 그럼 이를 어떻게 구성할 수 있는지 알아보자.

먼저 .NET ASP에서 이 기능을 활성화해야 한다.

“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727″에서 aspnet_regsql 명령을 이용하여 캐시 종속성 기능을 활성화할 수 있다.

이용 가능한 옵션은 다음과 같다.

-ed: 데이터베이스 캐시 종속성 활성화

-et: 테이블 캐시 종속성 활성화

-dd: 데이터베이스 캐시 종속성 비활성화

-dt: 테이블 캐시 종속성 비활성화

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe –S SYSADMIN-1822FC\SQLEXPRESS –E –d NoSQL –ed

[그림 2] NoSQL 데이터베이스에 대해 캐시 종속성을 활성화

// 만약 SQL 자체 인증을 이용하고자 한다면 다음과 같이 이용할 수 있다.

// Aspnet_regsql.exe –S
서버명
–U
SQL계정명
–P
패스워드
–d
데이터베이스
–t 테이블
–ed

// 앞서 생성한 테이블도 추가하도록 하자.

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe –S SYSADMIN-1822FC\SQLEXPRESS –E –d NoSQL –t tempdb_test1 –et

[실습 1] 데이터베이스 캐시 종속성 기능 활성화

위 명령을 이용하여 캐시를 활성화하면 이미 절반은 진행한 것이나 마찬가지다. 이 설정을 완료하고 나면 아래 그림과 같이 MSSQL 관리 도구에서 해당 데이터베이스에 “AspNet_SqlCacheTablesForChangeNotification” 테이블이 추가된 것을 알 수 있다. 이는 변경 내용이 있을 경우 SQLCacheDependencies 데이터가 변경되었다는 것을 빠르게 인지시킬 수 있는 트리거 기능을 제공하는데, 이 트리거의 changeId 필드 값이 기존과 다르게 변경되어 있는지를 확인하여, 효과적으로 데이터 변경 유무를 확인한다.

[그림 3] 변경시 트리거를 통해 트리거 테이블에 등록된다

데이터베이스 변경 내용을 직접 확인하고자 한다면 아래와 같은 명령을 이용하여 확인할 수 있다.

USE NoSQL

SELECT * FROM AspNet_SqlCacheTablesForChangeNotification

[그림 4] 테이블 내용에 변경이 있을 시 changeId 필드의 값이 변경된다.

이제 ASP.NET 환경설정을 구성하도록 하자. 먼저 IIS 6.0이므로 ASP.NET 버전을 2.0이상으로 변경하여야 한다(윈도우 2008이상인 경우 ASP.NET 버전 변경은 진행하지 않아도 된다).

[그림 5] IIS 6.0은 기본적으로 1.1.4322 버전으로 설정된다

ASP.NET을 이용하기 위해서는 2.0 이상 버전을 이용하여야 한다. 이를 위해 ASP.NET 2.0 버전을 아래 IIS 관리 도구
à
웹 서비스 확장에서 ASP.NET 2.0으로 등록한다.

[그림 6] ASP.NET v2.0 등록

아직 완료되지 않은 상태로 이 상태로 이용하고자 하면 오류가 발생한다.

[그림 7] 권한이 없다는 오류 페이지

이 오류는 ASP.NET 2.0 버전의 스크립트 매핑이 완료되지 않아서 발생하는 오류로, aspnet_regiis 명령을 이용하여 등록해 주면 위 오류는 더 이상 나타나지 않는다. 다음과 같이 ASP.NET DLL을 변경해준다.

Aspnet_regiis –r

위 명령을 실행하면 아래와 같이 변경된다.

[그림 8] 정상적으로 ASP.NET DLL 변경이 완료되었다

이후 web.config 파일을 sqlCacheDependency를 이용할 수 있도록 아래와 같이 변경해 주자.

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\web.config

<?xml
version=”1.0″
encoding=”utf-8″?>
<!–SQL 캐시 기능에 사용할 연결이름을 등록한다.–>
<configuration>
<connectionStrings>
<add
name=”NoSQLConnetion”
connectionString=

Data Source=.\SQLEXPRESS;User ID=nosql;Password=sjsj1111;Database=NoSQL;Persist Security Info=False         providerName=”System.Data.SqlClient”/>

</connectionStrings>

<system.web>

…중략

<!–SQLCacheDependencies를 이용하여 데이터를 가져오는 간격과 SQL 캐시 종속성기능을 활성화 한다.–>

<caching>

<!—10초에 한번만 가져오도록 한다. –>

<sqlCacheDependency
enabled=”true”
pollTime=”10000″ >

<databases>

<add
name=”NoSQL”
connectionStringName=”NoSQLConnetion” />

</databases>

</sqlCacheDependency>

</caching>

</system.web>

이제 사용을 위한 모든 설정을 완료하였다. 이제 캐시를 이용할 웹 페이지를 제작하고, 정상적으로 화면에 불려오는지 확인하도록 하자. 아래 내용을 확인하여 코딩하자.

load.aspx
<html>
<%@
Page=””
Language=”VB”
%>
<script
runat=”server”>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)Label.Text = “캐시 생성 시간 : ” & DateTime.Now.ToShortTimeString ()End Sub

</script>

<head
runat=”server”>

<title>sqlCacheDependency</title>

</head>

<body>

<form
id=”form”
runat=”server”>

<asp:Label
ID=”Label”
Runat=”server”></asp:Label>

<br />

<asp:GridView
ID=”GridView”
Runat=”server”
DataSourceID=”SqlDataSource”>

</asp:GridView>

<asp:SqlDataSource
ID=”SqlDataSource”
Runat=”server”


SelectCommand=”Select * From tempdb_test1″


ConnectionString=””

<%$
ConnectionStrings:NoSQLConnetion
%>”

Providername=”<%$
ConnectionStrings:NoSQLConnetion.providername
%>”
>

</asp:SqlDataSource>

</form>

</body>

</html>

[예제 1] 테스트 웹 페이지 load.aspx

만약 페이지 별로 별도의 캐시 종속성 시간을 가져가고자 한다면 아래 구문을 해당 ASP.NET페이지에 추가하자. 아래는 36초 간격으로 캐시 데이터를 확인하는 명령이다.

<%@
OutputCache Duration=”36000″
VaryByParam=”none”
SqlDependency=”NoSQL:tempdb_test1″%>

위에서 생성한 Load.aspx를 웹 브라우저로 확인하면, 아래와 같이 데이터베이스를 캐시하여 웹 페이지 화면을 보여준다.

[그림 9] 데이터베이스 내용을 캐시 후 출력한다

여기서는 SQL에 한정되어 애기하였지만, 이 내용을 디스크 사용 및 네트워크 전송에 관련된 다른 서비스에서도 생각해볼 가치가 충분하다. 기업에서 시스템 운영을 한다면, 성능 관점에서 개선방향을 찾아야 하는 경우가 종종 발생한다. 이때를 놓치지 않고 효과적으로 개선하게 된다면, 그 성취감은 이로 말할 수 없을 것이다. 관리자급이라면 후임자들로부터 더욱 신의를 얻을 수 있을 거라 생각된다.

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.