여기의 내용을 옮긴것입니다.
#Data Caching을 이용한 ASP성능향샹
ASP.NET의 가장 휴룡한 기능중의 하나는 cache page content기능입니다.
이기능은 웹사이트의 데이터베이스의 로드를 충분히 줄여 줍니다.
만약 사이트가 데이타를 저장하는데 SQL Server보다 Microsoft's Access를 쓰고 있다면 진짜로 매력적인 기능입니다.
불행하게도 ASP에는 그러한 caching system이 없습니다.
그러나 caching system을 구현하는게 어렵지는 않습니다.
아래에 소개된 기술이 legacy websites를 성능향샹을 가져올때 사용되어 질수 있으나
데이터베이스를 upgrading하거나 소스코드를 ASP.NET으로 변경하는것은 적절하지는 않습니다.
전형적인 ASP에서 Application object에 데이타를 저장함으로써 caching system을 사용할수 있습니다.
#ASP Data Caching의 예
예를들어 이런사이트가 있다고 가정하자
e-commerce website는 인기상품리스트 를 모든 페이지에서 보여주고
하루에 주문은 2-3이고 인기상품리스트가 빈번히 수정이 필요가 없다.
3개의 application변수가 global.asa안에 Application_OnStart에 있다.
Application("CachingDuration") = 120
Application("PopularProductsHTML") = ""
Application("PopularProductsHTML.LastModified") = Now()
CachingDuration application variable는 인기상품리스트가 저장되어 있는 초이다.
PopularProductsHTML application variable는 인기상품리스트HTML문이다.
PopularProductsHTML.LastModified application variable는 가장 최근에 데이터베이스에 접근해서 인기상품 리스트가 만들어진 시간이다.
GetPopularProductsHTML함수는 데이터베이스로 부터 인기상품리스트를 가져온다.
이 함수의 인수 NumberOfProducts는 인기상품 몇개로 리스트를 구성할지를 결정한다.
<%
Function GetPopularProductsHTML(NumberOfProducts)
On Error Resume Next
Dim DataConnection
Dim RecordSet
Dim SQL
Dim ReturnString
Dim ProductName, ProductId
Dim NumberOfProductsDisplayed
'
SQL = "Select [상품명], [상품코드] " & _
" From [상품주문내역서] " & _
" order by [팔린수량] desc"
Set DataConnection = Server.CreateObject("ADODB.connection")
DataConnection.Open Application("ConnectionString")
Set RecordSet = DataConnection.Execute(SQL)
NumberOfProductsDisplayed = 0
Do While Not RecordSet.EOF
If NumberOfProductsDisplayed < NumberOfProducts Then
ProductName = RecordSet("상품명")
ProductId = RecordSet("상품코드")
ReturnString = ReturnString & "<a class='MIME' href=ViewProduct.asp?Product=" & ProductId & ">" & ProductName & "</a><br>"
End If
NumberOfProductsDisplayed = NumberOfProductsDisplayed + 1
RecordSet.MoveNext
Loop
RecordSet.Close
Set RecordSet = nothing
DataConnection.Close
Set DataConnection = nothing
GetPopularProductsHTML = ReturnString
End Function
%>
이 함수는 인기상품목록을 만들기 위해 아래에 보여진것처럼 ASP VBScript에서 호출된다
이코드는 cached HTML가 기간이 만료가 되었는지 또한 확인한다.
만약 기간이 만료되었다면 데이터베이스로 부터 데이타를 다시 가져온다.
<%
Dim PopularProductsBoxTitleText
Dim PopularProductsBoxContentsText
Dim NumberOfProducts
PopularProductsBoxTitleText = "Popular Products"
NumberOfProducts = 25
'캐쉬가 비어 있으면 데이터베이스에 접속에 인기상품 목록을 다시 생성한다.
If Application("PopularProductsHTML") = "" Then
PopularProductsBoxContentsText = GetPopularProductsHTML(NumberOfProducts)
Application.Lock()
Application("PopularProductsHTML") = PopularProductsBoxContentsText
Application("PopularProductsHTML.LastModified") = Now()
Application.UnLock()
'데이터베이스 대신 캐쉬된 인기상품목록을 사용한다.
Else
PopularProductsBoxContentsText = Application("PopularProductsHTML")
'캐쉬가 시간이 지났는지?
'DateDiff함수는 초단위의 시간의 차이계산
If DateDiff("n", Application("PopularProductsHTML.LastModified"), Now()) > Application("CachingDuration") Then
Response.Write("<!--Cache Updated-->") '디버깅하기위해 사용
PopularProductsBoxContentsText = GetPopularProductsHTML(NumberOfProducts)
'Application variables에 새로운 인기상품목록 저장
Application.Lock()
Application("PopularProductsHTML") = PopularProductsBoxContentsText
Application("PopularProductsHTML.LastModified") = Now()
Application.UnLock()
End If
End If
'인기상품목록 표시
If PopularProductsBoxContentsText <> "" Then
%>
<div class="BoxOutline">
<div class="BoxTitle">
<span class="PopularProductsBoxTitleText"><%=PopularProductsBoxTitleText%></span>
</div>
<div class="BoxContents">
<span class="PopularProductsBoxContentsText">
<%=PopularProductsBoxContentsText%>
</span>
</div>
</div>
<%
End If
%>
절대로 잊지 말아야할것
Application변수에 데이타를 저장하는것은 사이트내의 모든 사용자들과 공유된다.
그래서 Application변수를 수정할때는 Lock()메소드를 호출해야만한다..
왜냐? 동시에 다른 사용자가 같은 Application변수를 수정하는걸 막기위해서다.
그리고 꼭 명심할것은 마지막에 Unlock()메소드로 다른사용자도 사용할수 있도록 잠금(LOCK)를 해제해 주어야 한다.
참고.
Caching은 빈번한 데이타의 변화가 없는 데이타에는 대단히 쓸모가 있다..
예를 들어 쇼핑몰에서 인기상품목록을 보여주거나 신간도서의 목록을 보여준다거나 할때..등등 많이 도움이 된다.
또한 같은페이지에서 여러부분에서 이러한 정보를 보여줘야 한다면 caching을 통한 성능향상은 많은 도움이 된다.
또한 관리자페이지에서 수동적으로 캐싱데이터(인기상품목록,신간도서목록등)을 데이터 베이스에서 바로 불러올수 있는 기능또한 필요하다.
사이트 관리자는 캐싱데이터가 새로적용되기위해서 캐쉬시간(CachingDuration)까지 기다려야 할 필요는 없다.
만약 사이트에서 많은 개개인마다 새로운 목록을 보여줄려면 Session object.안에서 caching data를 비워라..
Application("PopularProductsHTML") = ""
그러면 새 사용자가 사이트를 방문할때 마다 새로운 목록이 생성된다.
p.s 굳 아이디어.... 애플리케이션변수을 이렇게 활용하다니 ....바로 적용들어갑니다.ㅋㅋ
'WEB > ASP / DotNet' 카테고리의 다른 글
| 날짜 변형 함수 ASP -> SQL DATETIME형으로 (0) | 2007/06/07 |
|---|---|
| FSO 방식의 스킨 구현 (0) | 2007/06/07 |
| Data Caching을 이용한 ASP성능향샹 (0) | 2007/06/07 |
| asp로 도스명령어를 실행시켜주는 컴포넌트 (0) | 2007/06/07 |
| 맥 어드레스 얻기 (0) | 2007/06/07 |
| ADO/ASP를 이용하여 데이터를 FlexGrid에 나타내는 방법 (0) | 2007/06/07 |




최근에 달린 댓글
링크
최근에 받은 트랙백
태그목록