מטמון (Chaching)

‏ • 8 באוגוסט, 2003

Caching Page Output

 <%@OutPutCache location="Client" Duration="60" VaryByParam="none" %>

פקודה זו מקיימת מטמון בדף שלנו: התכונה location היא רשות בלבד ויכול לקבל אחת מחמש האפשרויות:

  • Client-מטמון ימוקם במחשב של הלקוח
  • Server-ימוקם בשרת שטיפל בבקשה
  • Downstream-המטמון יאוחסן בשרת ברמה נמוכה יותר מזה שטיפל בבקשה
  • None-לא יתבצע מטמון
  • Any-יכול להיות בכל אחד מהמקומות הנ"ל. זהו ערך ברירת המחדל

דוגמה לשימוש במטמון:

<%@ OutputCache Duration =20 VaryByParam ="none" %>
<script runat =server >
  Sub page_load(ByVal obj As Object, ByVal e As EventArgs)
     Response.Write(Now.ToString)
  End Sub
</script>

הוספנו הוראת outPutCache למשך 20 שניות. בנוסף קבענו כי המטמון לא יושפע ממערכי ה queryString שכבר נראה כיצד מתיחסים אליהם.
בשגרה page_load הדפסנו את הזמן כדי להמחיש שאחרי כמה רענוני עמוד הזמן מוצג כאותו זמן.

בכדי להבדיל בין ערכי הqueryString באשר הם יש לשנות את ההוראה ל:

<%@ OutputCache Duration =20 VaryByParam ="*" %>
<script runat =server >
  Sub page_load(ByVal obj As Object, ByVal e As EventArgs)
     Response.Write(Now.ToString + " - " + request.queryString("name"))
  End Sub
</script> 

בעת ששמנו את הערך * בתכונה VaryByParam, בכל פעם שאחרי הqueryString ישתנו יווצר לדף מטמון חדש.אם הערך name יהיה ירדן יווצר לו מטמון משלו , ואילו לשחר יווצר אחד משלו.
הינה תמונה להמחשה:

כשהערך לname הוא yarden:



כשהערך לName הוא idan:



ושוב חוזרים לירדן, ואין שינוי בזמן:



כדי להבדיל רק כשערך name משתנה בשורת הכתובת לדוגמה, יש לעשות כך:

<%@OutPutCache Duration="60" VaryByParam="name" %>  

אם מעוניינים בכמה פרמטרים יש להפרידם בפסיקים.

שימור אובייקטים במטמון

בשביל להוסיף אובייקטים למטמון קיימת המחלקה cach.מחלקה זו עדיפה בכמה מקרים על מטמון העמוד כולו:כאשר רוצים למטמן רק אובייקט מסויים בדף,אין צורן להכניס למטמון את כל הדף ואובייקט מוטמן יכול להיות תלוי בפריט אחר.

דוגמה לשימוש במחלקה cach בשביל למטמן פקד repeater:

<%@ Import Namespace =system %>
<%@ Import Namespace =system.data %>
<%@ Import Namespace =system.data.oledb %>
<script runat =server >
  Sub page_load(ByVal obj As Object, ByVal e As EventArgs)
     Dim CachedRep As DataView
     CachedRep = Cache("rep1")
     If CachedRep Is Nothing Then
         Dim conn As New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=" + Server.MapPath("db.mdb"))
         Dim cmd As New OleDbDataAdapter("Select username,userpassword from users", conn)
         Dim ds1 As DataSet = New DataSet()
         cmd.Fill(ds1, "users")
         CachedRep = New DataView(ds1.Tables("users"))
         Cache("rep1") = CachedRep
         Response.Write("טבלה נוצרה ממסד הנתונים")
     Else
         Response.Write("טבלה נלקחה מהמטמון")
     End If
     rep1.DataSource = CachedRep
     rep1.DataBind()
  End Sub
</script>
<html >
   <body dir =rtl>
         <asp:Repeater runat =server ID=rep1>
             <HeaderTemplate >
                 <table border =1 >
                    <tr>
                     <th>שם משתמש</th>
                     <th>סיסמה</th>
                    </tr>
             </HeaderTemplate>
             <ItemTemplate >
                    <Tr>
                     <td> 
                         <%#Container.DataItem("username")%>
                     </td>
                     <td>
                         <%#Container.DataItem("userpassword")%>
                     </td>
                 </Tr>
             </ItemTemplate>
             <FooterTemplate >
                 </table>
             </FooterTemplate>
         </asp:Repeater>
   </body>
</html>

תחילה יצרנו אובייקט dataView בשם cachedRep שיאכסן לנו את הפקד,לאחר מכאן מילאנו אותו בcache בשם rep1.

בדקנו האם הוא ריק:אם כן אין מטמון כזה ואז ניצור אחד, אם לא אז קיים מטמון כזה ואז נשתמש בוא.

במקרה שלא קיים יצרנו dataset ומילאנו את הcache rep1 בטבלה users ולבסוף קבענו כי מקור הנתונים של הפקד יהיה המטמון בכל מקרה.

בעת הכניסה לעמוד בפעם הראשונה זו התוצאה:



ולאחר רענון העמוד:



הנתונים נלקחו מזיכרון של המחשב בפעם השנייה.

בשביל למחוק את המטמון יש לעשות כך:

dim deletedCachedRep1 as dataView=cache.remove("rep1")

בשיטה זו ניתן להשתמש ב deletedCachedRep1 כמקור הנתונים עוד פעם אחרונה , הוא מכיל את הטבלה שהכיל cache("rep1").לו chach("rep1") היה ריק אז deletedCachedRep1 היה מחזיר Nothing.

תגיות: , , ,

תגובות בפייסבוק