جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
افزايش كارآئي برنامه هاي وب در ASP.NET 2.0 ( بخش دوم )
-(1 Body) 
افزايش كارآئي برنامه هاي وب در ASP.NET 2.0 ( بخش دوم )
Visitor 503
Category: دنياي فن آوري

Caching در كنترل منبع داده SqlDataSource

پس از فعال كردن پتانسيل caching در كنترل SqlDataSource ، ماحصل اجراي SelectQuery براي استفاده آتي Cache مي گردد . در صورت اجراء يك select query پارامتريك ، كنترل فوق براي هر مجموعه از مقادير پارامترها يك نسخه جداگانه را cache مي نمايد .
مثلا" ‌فرض كنيد قصد داريم صفحه اي را ايجاد نمائيم كه در آن ليست كاركنان بر اساس نام شهر نمايش داده شود . پس از انتخاب شهر توسط كاربر ، از يك كنترل SqlDataSource براي برگرداندن ركوردهاي كاركناني كه با نام شهر مطابقت مي نمايند جهت نمايش در يك grid استفاده شده است .
كد زير نحوه استفاده از كنترل SqlDataSource با هدف فعال كردن caching را نشان مي دهد .

<asp:SqlDataSource ID="sourceEmployees" runat="server"
      ProviderName="System.Data.SqlClient"
      EnableCaching="True"CacheDuration="600"
      ConnectionString="<%$ ConnectionStrings:Northwind %>"
      SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees WHERE City=@City">
     <SelectParameters>
          <asp:ControlParameter ControlID="lstCities" Name="City" PropertyName="SelectedValue" />
     </SelectParameters>
</asp:SqlDataSource>

در مثال فوق ، پس از انتخاب شهر توسط كاربر ، يك query جداگانه اجراء خواهد شد تا ليست كاركنان با توجه به شهر انتخاب شده ، بازيابي و در يك DataSet به ميزان 10 دقيقه ( 600 ثانيه ) ، cache گردد . در صورت انتخاب يك شهر ديگر توسط كاربر ، پردازش فوق تكرار و مجددا" يك DataSet جديد ايجاد و cache مي گردد. در صورت انتخاب يك شهر توسط كاربري كه قبلا" توسط كاربران ديگر انتخاب شده است ، DataSet مورد نظر از cache بازيابي خواهد شد ( مشروط به عدم اتمام مدت زمان اعتبار حضور آن در cache ) .
توجه داشته باشيد زماني كه مقدار خصلت DataSourceMode معادل DataSet در نظر گرفته شده باشد (مقدار پيش فرض) ، پتانسيل caching در كنترل منبع داده SqlDataSource به خوبي كار مي كند . شي DataReader نمي تواند بطور موثر cache گردد چراكه شي فوق قادر به برقراري يك ارتباط مستقيم و زنده با بانك اطلاعاتي نمي باشد .
در صورتي كه برخي پارامترها نسبت به پارامترهاي ديگر با فركانس بيشتري استفاده شده باشند ، caching جداگانه نتايج با توجه به مقادير مختلف پارامترها وضعيت مطلوبتري را به دنبال خواهد داشت . مثلا" اگر نتايج مربوط به شهر "X " بمراتب بيش از نتايج شهر "Y" درخواست گردد ، اين اطمينان ايجاد خواهد شد كه نتايج شهر "X" بمراتب بيش تر در cache باقي خواهند ماند حتي اگر DataSet مربوط به شهر "Y" از حافظه خارج شده باشد .
به عبارت ديگر ، در صورتي كه مقادير پارامتر ها جملگي با فركانس مشابهي استفاده شوند ، روش فوق يك راه حل مناسب نمي باشد . يكي از مسائل مرتبط با راه حل فوق ، زماني است كه مدت زمان حضور آيتم هاي cache شده به اتمام رسيده باشد و لازم است كه جندين query را بر روي بانك اجراء نمود تا نسخه هاي جداگانه اي از cache را ايجاد نمايد ( نسخه هاي cache جداگانه با توجه به مقدار پارامتر ) . قطعا" روش فوق داراي كارآئي بمراتب كمتري نسبت به حالتي است كه تمامي نتايج صرفا" با يك query بازيابي مي گردد .
در چنين مواردي مي توان تمامي ركوردهاي كاركنان را بازيابي و در cache ذخيره نمود . در ادامه ، كنترل SqlDataSource مي تواند صرفا" ركوردهاي مورد نياز را متناسب با درخواست كاربر از DataSet بازيابي نمايد . بدين ترتيب ، يك DataSet به همراه تمامي ركوردهاي cache شده مي تواند صرفنظر از مقدار پارامتر دريافتي پاسخگو باشد .
براي نيل به خواسته فوق ، مي بايست دو تغيير اساسي را در كد فوق اعمال نمود .
اولين تغيير : بازيابي تمامي ركوردها با استفاده از select query ( عدم استفاده از SelectParameter ) . كد زير نحوه انجام اين كار را نشان مي دهد :

<asp:SqlDataSource ID="sourceEmployees" runat="server"
   SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees"
    ...>
</asp:SqlDataSource>

دومين تغيير :تعريف يك عبارت فيلترينگ . بدين منظور از بخش WHERE در query با اندك تفاوت هائي استفاده مي گردد . در صورت دريافت مقدار فيلتر مورد نظر از يك منبع ديگر ( نظير يك كنترل ) ، مي بايست از يك و يا چندين placeholder استفاده نمود . بدين منظور از گرامر {0} براي اولين پارامتر و {1} براي دومين پارامتر و ... استفاده مي گردد . در ادامه امكان استفاده از مقدار مختلف فيلترها كه توسط بخش <FilterParameters> مشخص شده است ، فراهم مي گردد .
كد زير نحوه تعريف كنترل منبع داده SqlDataSource را پس از اعمال دو تغيير فوق نشان مي دهد .

<asp:SqlDataSource ID="sourceEmployees" runat="server"
      ProviderName="System.Data.SqlClient"
      EnableCaching="True" CacheDuration="600"
      ConnectionString="<%$ ConnectionStrings:Northwind %>"
     SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees"
       FilterExpression="City='{0}'"
       EnableCaching="True">
      <FilterParameters>
         <asp:ControlParameter ControlID="lstCities" Name="City" PropertyName="SelectedValue" />
      </FilterParameters>

توجه داشته باشيد در صورت عدم استفاده از caching ، ضرورتي به فعال كردن فيلترينگ وجود ندارد . چراكه در صورت استفاده از فيلترينگ بدون caching ، در واقع تمامي result set بازيابي خواهد شد تا در ادامه بتوان بخشي از ركوردهاي آن را بازيابي كرد . بدين ترتيب ، پس از هر postback و بدون توجيه منطقي تمامي ركوردها ( بيش از آن چيزي كه مورد نياز است ) ، بازيابي مي گردد .

caching در كنترل ObjectDataSource

caching كنترل ObjectDataSource با اشياء داده برگردانده شده توسط SelectMethod به خوبي كار مي كند . در صورت استفاده از يك query پارامتريك ،‌ كنترل ObjectDataSource درخواست هائي با پارامترهاي مختلف را بطور جداگانه cache مي نمايد.
caching كنترل ObjectDataSource داراي يك محدوديت قابل ملاحظه است و صرفا" زماني كار مي كند كه SelectMethod آن يك DataSet يا DataTable را برمي گرداند . در صورت برگرداندن هر نوع اشياء داده ديگر ، با يك NotSupportedException مواجه خواهيم شد .
براي غلبه بر محدوديت فوق مي توان پياده سازي data caching را درون متد مربوطه انجام و اقدام به درج دستي اشياء درون data cache كرد. در واقع ، caching درون متد مورد نظر مي تواند كارآئي بمراتب بهتري را نيز به دنبال داشته باشد چراكه امكان به اشتراك گذاشتن اشياء cache شده مشابه بين چندين متد فراهم مي گردد . مثلا" مي توان يك DataTable حاوي ليستي از محصولات را cache و در ادامه از آيتم هاي cache شده در متدهاي GetProductCategories و GetProductsByCategory استفاده نمود .

Caching با وابستگي

ماهيت منابع داده نظير يك بانك اطلاعاتي بگونه اي است كه به مرور زمان اطلاعات درون آنها تغيير مي يابد . در صورتي كه در يك برنامه از caching استفاده مي گردد ، همواره اين احتمال وجود خواهد داشت كه اطلاعات موجود در cache متاثر از اين تغييرات نباشد و داده بهنگام نشده از cache استخراج و در اختيار كاربران گذاشته شود.
براي كمك در جهت حل اين نوع مشكلات ، ASP.NET از caching با وابستگي حمايت مي نمايد . با استفاده از ويژگي فوق اين امكان در اختيار پياده كنندگان قرار مي گيرد تا بتوانند حضور يك آيتم در cache را به منابع ديگري وابسته نمايند . در چنين مواردي ، زماني كه در منبع مورد نظر تغييراتي ايجاد گرديد ، آيتم cache شده بطور اتوماتيك از cache خارج مي گردد .
ASP.NET از سه نوع وابستگي حمايت مي نمايد :
• وابستگي با ساير آيتم هاي Cache شده
• وابستگي با فايل ها و يا فولدرها
• وابستگي با يك query بانك اطلاعاتي
براي ايجاد يك cache وابسته ، مي بايست يك شي CacheDependency ايجاد و در ادامه از آن در زمان اضافه كردن آيتم مورد نظر به cache استفاده كرد .
كد زير يك آيتم cache شده را ايجاد كه بطور اتوماتيك و پس از ايجاد تغييرات در فايل xml از cache خارج مي شود .

ايجاد يك وابستگي براي فايل ProductList.xml

 Dim prodDependency As New CacheDependency(Server.MapPath("ProductList.xml"))

در زمان درج آيتم مورد نظر در cache از شي CacheDependency ايجاد شده در مرحله قبل استفاده مي گردد .
ا

اضافه كردن يك آيتم در cacheكه حضور آن در cacheبه فايل  ProductList.xml  وابسته مي گردد

 Cache.Insert("ProductInfo", prodInfo, prodDependency)

پس از ايجاد شي CacheDependency ، مانيتورينگ آغاز مي گردد . در صورتي كه فايل xml قبل از افزودن آيتم وابسته به درون cache تغيير يافته باشد ، بلافاصله تاريخ اعتبار آيتم موردنظر پس از افزودن به cache به پايان مي رسد .
شي CacheDependency چندين constructor را ارائه مي نمايد . در مثال قبل مشاهده گرديد كه چگونه شي فوق قادر به ايجاد يك وابستگي بر اساس يك فايل است كه نام آن به عنوان constructor در نظر گرفته مي شود . همچنين مي توان يك دايركتوري را معرفي تا تغييرات آن مانيتور گردد .
مثال : ايجاد و درج يك آيتم درون cache كه حضور آن در cache به يك فايل وابسته مي گردد
در اين مثال با ايجاد يك شي وابسته ( يك فايل text ) ،‌ يك عبارت ( " آيتم cache شده وابسته " ) وابسته به شي فوق را در cache قرار مي دهيم . تا زماني كه داده موجود در فايل text تغيير نيابد ، آيتم مورد نظر در cache باقي مي ماند و مي توان از آن استفاده كرد . در صورت تغيير در شي وابسته ( فايل dependency.txt ) اعتبار آيتم cache شده به اتمام رسيده و بطور اتوماتيك از cache خارج مي شود .
در اين برنامه از دو button به نام " تغيير فايل " و " بررسي آيتم cache شده " استفاده شده است . با استفاده از دكمه "بررسي آيتم cache شده " ، حضور آيتم مورد نظر در cache بررسي و پيام مناسب در خروجي نمايش داده مي شود . در صورت كليك بر روي دكمه "تغيير فايل " ، محتويات شي وابسته ( فايل dependency.txt ) تغيير يافته و آيتم مورد نظر از cache خارج مي گردد .
كد برنامه فوق در جدول زير نشان داده شده است .

درج يك آيتم  در cache  با وابستگي به يك شي ( فايل )

<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>
<%@ Import Namespace="System.IO" %>

<script runat="server">
'=====================================================================
Sub cmdModify_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdModify.Click
  lblInfo.Text &= "تغيير فايلوابسته<br />"
  Dim w As StreamWriter = File.CreateText(Server.MapPath("dependency.txt"))
  w.Write(DateTime.Now)
  w.Flush()
  w.Close()
End Sub
'=====================================================================
 Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Me.IsPostBack Then
    lblInfo.Text &= "ايجاد آيتم وابسته<br />"
    Cache.Remove("File")
    Dim dependency As New System.Web.Caching.CacheDependency( _
    Server.MapPath("dependency.txt"))
    Dim item As String = "آيتمcache شده وابسته"
    lblInfo.Text &= "اضافه كردن آيتم وابسته<br />"
    Cache.Insert("File", item, dependency)
 End If
End Sub
'=====================================================================
Sub cmdGetItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdGetItem.Click
  If Cache("File") Is Nothing Then
      lblInfo.Text &= " آيتم مورد نظر در‌‍cache موجود نمي باشد و امكان بازيابي آن وجود ندارد<br />"
    Else
     Dim cacheInfo As String = CType(Cache("File"), String)
      lblInfo.Text &= " آيتم موردنظر در‌‍cache موجود است و امكان بازيابي آن وجود دارد<br />"
  End If
 End Sub
'=====================================================================
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
 <head id="Head1" runat="server">
  <title>تستcaching </title>
 </head>
 <body style="font-family: Tahoma">
   <form id="Form1" method="post" runat="server">
    <asp:button id="cmdModify" runat="server" Text="تغيير فايل" Width="103px"
                       Font-Names="Tahoma"></asp:button>
    <asp:button id="cmdGetItem" runat="server" Text="بررسي آيتمcache شده" Width="140px"
                      Height="24px" Font-Names="Tahoma"></asp:button><br /><br />
     <asp:label id="lblInfo" runat="server" Width="480px" Height="192px" BorderWidth="2px"
                     BorderStyle="Groove" Font-Names="Tahoma" Font-Size="Small"
                     BackColor="LightYellow"></asp:label>
  </form>
 </body>
</html>

توضيحات :

• در زمان فراخواني برنامه فوق از طريق روتين Page_laod عمليات زير انجام مي شود :
- ايجاد يك شي dependency ( يك فايل متن با نام dependency.txt )
- درج آيتم مورد نظر با نام File و مقدار " آيتم cache شده وابسته " در cache
- نمايش پيام هاي مناسب در خروجي به كمك كنترل سرويس دهنده label ( با نام lblInfo )
• روتين cmdGetItem_Click ، وجود آيتم مورد نظر را در Cache بررسي و در صورتي كه اين آيتم در cache موجود نباشد يك پيام خاص از طريق كنترل سرويس دهنده label در خروجي نمايش داده مي شود . در صورت وجود آيتم مورد نظر در cache ، مقدار آن از cache بازيابي و يك پيام خاص از طريق كنترل سرويس دهنده label در خروجي نمايش داده مي شود .
• روتين cmdModify_Click ، مسئوليت ايجاد تغيير در فايل وابسته ( نام dependency.txt ) را برعهده دارد . در روتين فوق پس از ايجاد فايل ، تاريخ جاري سيستم در آن نوشته مي گردد .
SQL Server cache dependency ، يكي از نوع هاي پيچيده caching وابسته است كه در ASP.NET 2.0 ارائه شده است . با استفاده از ويژگي فوق بطور اتوماتيك يك شي داده cache شده ( نظير يك DataSet ) پس از تغيير داده مرتبط در بانك اطلاعاتي ، غير معتبر مي گردد . از پتانسيل فوق در در SQL Server 2005 ( شامل Express Edition ) و SQL Server 2000 حمايت مي گردد .
سيستم آگاه سازي caching در SQL Server 2000 و SQL Server 7
ASP. NET از مدل pooling براي SQL Server 2000 و SQL Server 7 استفاده مي نمايد . نسخه هاي قديمي تر SQL Server و ساير بانك هاي اطلاعاتي از ويژگي فوق حمايت نمي نمايند .
در اين روش ، ASP.NET يك ارتباط باز با بانك اطلاعاتي را نگاه داشته و به صورت دوره اي بروز هر گونه تغيير در يك جدول را بررسي مي نمايد . نگهداري‌ يك اتصال باز به منزله بروز يك فاجعه در سطح بانك اطلاعاتي نمي باشد و صرفا" كار اضافه تري در سطح بانك اطلاعاتي ايجاد مي گردد كه انجام آن فرآيند مختص به خود را دارد.
به منظور بهره گيري بيشتر و موثر از مدل pooling ، مي بايست فرآيند pooling سريع تر و سبك تر از query اوليه اي باشد كه مسئوليت استخراج داده از بانك اطلاعاتي را برعهده دارد .
هدف سيستم آگاه سازي caching ، تشخيص به موقع انجام تغييرات در جداول يك بانك اطلاعاتي و غيرمعتبر كردن داده cache شده مرتبط با هر يك از جداول است .
براي فعال كردن سيستم آگاه سازي در SQL Server 2000 مي بايست مراحل زير را دنبال نمود :‌
• مرحله اول : مشخص كردن جداولي از بانك اطلاعاتي كه نيازمند حمايت از سيستم آگاه سازي caching مي باشند .
• مرحله دوم : فعال كردن سيستم آگاه سازي caching بر روي بانك اطلاعاتي مورد نظر به كمك برنامه خط دستوري aspnet_regsql.exe
• مرحله سوم : ريجستر كردن جداولي كه نيازمند حمايت از سيستم آگاه سازي caching مي باشد . بدين منظور مجددا" از برنامه خط دستوري aspnet_regsql.exe و اين مرتبه در سطح جدول استفاده مي گردد .
• مرحله چهارم : فعال كردن polling از طريق فايل web.config
پس از انجام مراحل چهارگانه فوق مي توان اشياء SqlCacheDependency را ايجاد نمود .
در ادامه هر يك از مراحل فوق را با جزئيات بيشتري بررسي مي نمائيم . مرحله اول : مشخص كردن جداولي از بانك اطلاعاتي كه نيازمند حمايت از سيستم آگاه سازي caching مي باشند .
بدين منظور لازم است كه در اولين اقدام بانك اطلاعاتي و جداولي كه لازم است بر روي آنها سيستم آگاه سازي caching فعال شود ، شناسائي و انتخاب گردند . انتخاب بانك طلاعاتي و جداول مربوطه به رفتار يك برنامه و انتظارات از آن بستگي دارد كه مي بايست توسط طراحان و پياده كنندگان برنامه هاي وب به دقت انجام شود .
مرحله دوم : فعال كردن سيستم آگاه سازي caching بر روي بانك اطلاعاتي مورد نظر به كمك برنامه خط دستوري aspnet_regsql.exe
قبل از اين كه بتوان از سيستم غيرمعتبر سازي Cache در SQL Server استفاده نمود ، مي بايست سيستم آگاه سازي caching را براي بانك اطلاعاتي مورد نظر فعال كرد . به منظور انجام اين كار از برنامه خط دستوري aspnet_regsql.exe كه در مسير [ c:\[WinDir]\Microsoft.NET\Framework\[Version موجود است ، استفاده مي گردد . برنامه فوق يك ابزار مديريتي براي فعال كردن و غيرفعال كردن ويژگي هاي ASP.NET بر روي يك سرويس دهنده SQL است . اين برنامه داراي سوئيچ هاي متعددي‌ است . ed ، يكي از سوئيچ هاي اين دستور است كه از آن براي فعال كردن SQL cache dependency بر روي يك بانك اطلاعاتي استفاده مي گردد . همچنين ، از سوئيچ E به منظور مشخص كردن روش تائيد بر اساس يك اتصال ايمن و از سوئيچ d براي مشخص كردن بانك اطلاعاتي كه قرار است سيستم آگاه سازي caching بر روي آن فعال گردد ، استفاده مي شود .
دستور زير نحوه استفاده از برنامه aspnet_regsql.exe به منظور فعال كردن سيستم آگاه سازي caching بر روي بانك اطلاعاتي AspNet استاندارد موجود بر روي سرويس دهنده جاري را نشان مي دهد .

  aspnet_regsql -ed -E -d AspNet

پس از انجام عمليات فوق ، يك جدول جديد با نام SqlCacheTablesForChangeNotification به بانك اطلاعاتي با نام AspNet اضافه مي گردد. جدول فوق داراي سه ستون notificationCreated ، tableName و changeId است و از آن براي پيگيري انجام تغييرات استفاده مي گردد .
سرويس polling در ASP.NET با جدول فوق تعامل برقرار و از آن به منظور ارائه خدمات خود استفاده مي نمايد . سيستم فوق و نحوه پياده سازي آن مزاياي متعددي را به دنبال دارد :
• با توجه به اين كه جدول آگاه سازي تغييرات بمراتب كوچكتر از جدول حاوي داده cache شده است ، سرعت اجراي query بر روي آن سريعتر خواهد بود .
• با توجه به عدم استفاده از جدول آگاه سازي براي فعاليت هاي ديگر ، در زمان خواندن ركوردهاي آن با مسائلي همچون قفل كردن ركوردها و همزماني مواجه نخواهيم شد .
• باتوجه به اين كه چندين جدول در يك بانك اطلاعاتي مشابه از يك جدول آگاه سازي مشابه استفاده مي نمايند ، مي توان چندين جدول را بدون افزايش هزينه هاي بالاسري pooling در يك لحظه مانيتور كرد.
مرحله سوم : ريجستر كردن جداولي كه نيازمند حمايت از سيستم آگاه سازي caching مي باشد.
پس از ايجاد جدول SqlCacheTablesForChangeNotification ، مي بايست براي هر جدول موجود در بانك اطلاعاتي سيستم آگاه سازي caching فعال گردد . بدين منظور مي توان از SqlCacheRegisterTableStoredProcedure و يا برنامه كاربردي aspnet_regsql به همراه پارامتر هاي et - ( فعال كردن سيستم آگاه سازي بر روي يك جدول ) و t - ( نام جدول ) استفاده نمود .
دستور زير نحوه فعال كردن سيستم آگاه سازي را براي جدول Employees بانك اطلاعاتي Northwind نشان مي دهد .

  aspnet_regsql -et -E -d Northwind -t Employees

> پس از اجراي دستور فوق ، trigger آگاه سازي caching براي جدول Employees ايجاد مي گردد .
مرحله چهارم : فعال كردن polling از طريق فايل web.config
در اين مرحله به ASP.NET اعلام مي گردد كه از polling بانك اطلاعاتي استفاده نمايد .
براي فعال كردن سرويس polling از عنصر <sqlCacheDepency> در فايل web.config استفاده مي گردد . بدين منظور لازم است كه خصلت enabled مقدار true را داشته باشد تا ويژگي فوق فعال گردد . همچنين توسط خصلت pollTime مدت زمان مورد نظر ( بر حسب ميلي ثانيه ) بين هر poll مشخص مي گردد . هر اندازه مقدار خصلت فوق بيشتر باشد ، تغييرات با تاخير بيشتري تشخيص داده مي شوند. در بخش <sqlCacheDepency> فايل web.config و به كمك <databases> بانك و يا بانك هاي اطلاعاتي مشمول سيستم آگاه سازي caching معرفي مي گردند .
كد زير نحوه فعال كردن polling از طريق فايل web.config براي بانك اطلاعاتي Northwind را نشان مي دهد .

فعال كردن pollingاز طريق فايل web.config

<configuration>
  <connectionStrings>
     <add name="Northwind" connectionString=
            "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI"/>
     </connectionStrings>
 <system.web>
<caching>
  <sqlCacheDependency enabled="true" pollTime="15000" >
    <databases>
         <add name="Northwind" connectionStringName="Northwind" />
   </databases>
</sqlCacheDependency>

</caching>
...
</system.web>
</configuration>

نحوه كار سيستم آگاه سازي caching

پس از انجام مراحل اشاره شده بستر لازم براي استفاده از سيستم آگاه سازي caching آماده مي شود. براي آشنائي با نحوه عملكرد سيستم فوق يك نمونه مثال را با يكديگر دنبال مي نمائيم .
فرض كنيد قصد داريم نتيجه query زير را cache نمائيم .

  SELECT * FROM Employees

query فوق ركوردهاي موجود در جدول Employees را بازيابي مي نمايد . براي آگاهي از اين كه چه زماني يك ركورد جديد در جدول Employees درج ، حذف و يا ويرايش شده است تا بر اساس آن شي cache شده غير معتبر گردد ، از يك trigger استفاده مي شود . trigger مورد نظر بر روي جدول Employees و توسط برنامه كمكي aspnet_regsql ايجاد مي شود .

ايجاد يك triggerبر روي جدول Employees

 CREATE TRIGGER dbo.[Employees_AspNet_SqlCacheNotification_Trigger]
 ON [Employees]
   FOR INSERT, UPDATE, DELETE AS BEGIN
     SET NOCOUNT ON
     EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'Employees'
 END

بدين ترتيب ، پس از بروز هر گونه تغيير بر روي جدولي كه مانيتور مي گردد ، يك stored procedure با نام AspNet_SqlCacheUpdateChangeIdStoredProcedure فعال و changeId سطر مربوطه را در جدول آگاه سازي تغييرات اضافه مي نمايد .

     AspNet_SqlCacheUpdateChangeIdStoredProcedure

 CREATE PROCEDURE dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure
   @tableName NVARCHAR(450)
  AS
    BEGIN
       UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH (ROWLOCK)
       SET changeId = changeId + 1
       WHERE tableName = @tableName
   END
GO

در جدول AspNet_SqlCacheTablesForChangeNotification براي هر جدولي كه قصد مانيتورينگ آن را داريم يك ركورد ايجاد مي گردد. پس از بروز تغيير در جدول ( نظير درج يك ركورد جديد ) ، يك واحد به ستون changeId اضافه مي گردد . ASP. NET به صورت دوره اي اين جدول و مقادير مربوط به changeId را بررسي و در صورتي كه مقدار فيلد فوق تغيير نمايد ، از بروز تغييرات در جدول مورد نظر آگاه مي گردد .
روش فوق يكي از محدوديت هاي غيرمعتبرسازي caching در SQL Server 2000 و SQL Sever 7 را نشان مي دهد : هر نوع تغيير بر روي جدول باعث غيرمعتبر شدن هرگونه query بر روي جدول مي گردد . به عنوان نمونه فرض كنيد كه از query زير استفاده كرده باشيم :

  SELECT * FROM Employees WHERE City='City1'

پس از اجراي query فوق ، ركورد كاركناني كه فيلد شهر آنان معادل city1 باشد ، cache مي گردد . در چنين وضعيتي اگر ركورد يكي از كاركنان كه فيلد city آن معادل city1 نباشد تغيير يابد ( ركورد اين نوع كاركنان قبلا" cache نشده است ) ، سيستم آگاه سازي caching اطلاعات مربوط به غيرمعتبرسازي داده cache شده را ارسال مي نمايد( غيرمعتبر شدن داده موجود در cache كه در عمل هيچكدام از ركوردهاي آن در جدول Employees تغيير نكرده اند ) .
تشخيص و پيگيري اين كه كدام تغيير مي تواند زمينه غيرمعتبر سازي يك داده cache شده را فراهم نمايد مستلزم انجام عمليات سنگيني توسط SQL Server 2000 است ( اين كار در SQL Server 2005 امكان پذير است ) .

ايجاد cache dependency

در بخش قبل با نحوه پيكربندي يك بانك اطلاعاتي براي حمايت از سيستم آگاه سازي SQL Server آشنا شديم .پس از فراهم شدن زيرساخت لازم مي توان از آن در برنامه هاي وب با استفاده از يكي از روش هاي زير استفاده نمود .
• data caching از طريق برنامه : براي data caching از طريق كد لازم است كه يك شي جديد SqlCacheDependency ايجاد و آن را با استفاده از متد Cache.Insert به cache اضافه نمود ( مشابه file dependency ) .
در constructor شي SqlCacheDependency مي بايست دو رشته را مشخص كرد . اولين رشته نام بانك اطلاعاتي ( توسط عنصر <add> در بخش <sqlCacheDependency> فايل web.config مشخص شده است ) و دومين رشته ، نام جدولي است كه قصد مانيتورينگ تغييرات آن را داريم.
در اولين مرحله يك وابستگي براي جدول Employees بانك اطلاعاتي Northwind ايجاد و در مرحله بعد آيتم مورد نظر را به cache اضافه مي نمائيم . حضور آيتم فوق مشروط به عدم بروز تغييرات در جدول Employees است . در صورت بروز تغييرات در جدول فوق ، اعتبار داده cache شده به اتمام رسيده و از cache خارج مي گردد .
كد زير نحوه انجام اين كار را نشان مي دهد .

Dim empDependency As New SqlCacheDependency("Northwind", "Employees")
Cache.Insert("Employees", dsEmployees, empDependency)

• output caching : بدين منظور لازم است كه خصلت SqlCacheDependency به دايركتيو OutputCache معرفي شود . مقدار خصلت فوق شامل نام بانك اطلاعاتي وابسته و جدول مورد نظر است كه توسط يك colon از يكديگر جدا شده اند .
كد زير نحوه انجام عمليات فوق را نشان مي دهد .

 <%@ OutputCache Duration="600" SqlDependency="Northwind:Employees" VaryByParam="none" %>

• يك كنترل منبع داده: از روش فوق مي توان به همراه كنترل هاي SqlDataSource و ObjectDataSource استفاده كرد . كد زير نحوه انجام اين كار را نشان مي دهد .

 <asp:SqlDataSource EnableCaching="True" SqlCacheDependency="Northwind:Employees" ... />

بررسي‌ يك مثال كاربردي

در اين مثال پس از فعال كردن سيستم آگاه سازي caching بر روي جدول Employees بانك اطلاعاتي Northwind ، يك داده فرضي در cache ذخيره مي گردد . در صورت بروز هر گونه تغيير در جدول Employees ، اعتبار داده cache شده با توجه به مدت زمان تعريف شده توسط خصلت pollTime عنصر <sqlCacheDepency> موجود در فايل web.config به اتمام خواهد رسيد .
بدين منظور عمليات مورد نياز جهت پياده سازي را در دو فاز مختلف دنبال مي نمائيم . فاز اول : ايجاد زيرساخت لازم براي استفاده از سيستم آگاه سازي caching
در اين مثال براي فعال كردن سيستم آگاه سازي caching بر روي بانك اطلاعاتي Northwind و ريجستر كردن جدول Employees به منظور حمايت از سيستم آگاه سازي caching توسط برنامه خط دستوري aspnet_regsql.exe از سوئيچ C - استفاده شده است تا در مقابل مشخص كردن نام كاربر ، رمز عبور و نام سرويس دهنده از يك Connection string استفاده گردد . مرحله اول : فعال كردن سيستم آگاه سازي caching بر روي بانك اطلاعاتي Northwind به كمك برنامه خط دستوري aspnet_regsql.exe

  C:\WINDOWS\Microsoft. NET\Framework\V2.0.50727>aspnet_regsql -ed
    -C "Data Source=SRCOSERVER\SQLEXPRESS;Initial Catalog=NORTHWND;Integrated Security=True"

  Enabling the database for SQL cache dependency.
 ....
 Finished.

پس از اجراي دستور فوق ، يك جدول جديد با نام SqlCacheTablesForChangeNotification به بانك اطلاعاتي Northwind اضافه مي گردد. جدول فوق داراي سه ستون notificationCreated ، tableName و changeId است و از آن براي پيگيري انجام تغييرات استفاده مي گردد . مرحله دوم : ريجستر كردن جدول Employees كه نيازمند حمايت از سيستم آگاه سازي caching است .

  C:\WINDOWS\Microsoft. NET\Framework\V2.0.50727>aspnet_regsql -et
    -C "Data Source=SRCOSERVER\SQLEXPRESS;Initial Catalog=NORTHWND;Integrated Security=True"
    -t Employees

  Enabling the table  for SQL cache dependency.
 .
 Finished.

مرحله سوم : فعال كردن polling از طريق فايل web.config
فعال كردن polling از طريق فايل web.config

فعال كردن pollingاز طريق فايل web.config

<configuration>
   <connectionStrings>
       <add name="NORTHWNDConnectionString"
            connectionString="Data Source=SRCOSERVER\SQLEXPRESS;
            Initial Catalog=NORTHWND;Integrated Security=True"/>
   </connectionStrings>
 <system.web>
<caching>
  <sqlCacheDependency enabled="true" pollTime="15000" >
    <databases>
         <add name="Northwind" connectionStringName="
NORTHWNDConnectionString" />
   </databases>
</sqlCacheDependency>

</caching>
...
</system.web>
</configuration>

فاز دوم : استفاده از زيرساخت ايجاد شده سيستم آگاه سازي caching در برنامه
در اين برنامه از دو button به نام " تغيير جدول " و " بررسي آيتم cache شده " استفاده شده است . با استفاده از دكمه "بررسي آيتم cache شده " ، حضور آيتم مورد نظر در cache بررسي و پيام مناسب در خروجي نمايش داده مي شود . در صورت كليك بر روي دكمه "تغيير جدول " ، يكي از ركورهاي موجود در جدول Employees بانك اطلاعاتي Northwind تغيير يافته و بهانه خارج شدن داده cache شده از حافظه ايجاد مي گردد .
كد برنامه فوق در جدول زير نشان داده شده است .

 ايجاد cachedependencyدر بانك اطلاعاتي NORTHWND

<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>  
<%@ import Namespace="system.Data" %>
<%@ import Namespace="system.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<Script runat="server">
 Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  If Not Me.IsPostBack Then
    lblInfo.Text &= "ايجاد آيتم وابسته<br />"
     Cache.Remove("CachedItem")
   '  Employees  ايجاد يك وابستگي براي جدول
     Dim dependency As New SqlCacheDependency("Northwind", "Employees")
     Dim dt As DataTable = GetEmployeeTable()
     lblInfo.Text &= "اضافه كردن آيتم مورد نظر بهcache<br />"
     Cache.Insert("CachedItem", dt, dependency)
  End If
 End Sub
  ' =================================================================
Private connectionString As String =_
          WebConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
 Function GetEmployeeTable() As DataTable
  Dim con As New SqlConnection(connectionString)
  Dim sql As String = "SELECT * FROM Employees"
  Dim da As New SqlDataAdapter(sql, con)
  Dim ds As New DataSet()
  da.Fill(ds, "Employees")
  Return ds.Tables(0)
End Function
  ' ==================================================================
 Sub cmdGetItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdGetItem.Click
 If Cache("CachedItem") Is Nothing Then
   lblInfo.Text &= "آيتم مورد نظر درcache موجود نمي باشد<br />"
 Else
  lblInfo.Text &= "آيتم مورد نظر همچنان درcache موجود است<br />"
 End If
End Sub
  ' =================================================================
Sub cmdModify_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdModify.Click
 Dim con As New SqlConnection(connectionString)
' بهنگام سازي بانك اطلاعاتي
 Dim sql As String = "UPDATE Employees SET LastName='sakha ravesh' WHERE LastName='srco'"
 Dim cmd As New SqlCommand(sql, con)
 Try
   con.Open()
   cmd.ExecuteNonQuery()
 Finally
 con.Close()
 End Try
 lblInfo.Text &= "بهنگام سازي بانك به تمامرسيد ، تا اتمام زمانpolling منتظر بمانيد<br />"
End Sub
 ' =================================================================
</Script>
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
  <head id="Head1" runat="server">
     <title>Untitled Page</title>
  </head>
  <body style="font-family: Tahoma">
     <form id="form1" runat="server">
       <div>
           <asp:Button ID="cmdModify" runat="server" Height="24px"  Text="تغيير جدول"
                              Width="103px" Font-Names="Tahoma" />
           <asp:Button ID="cmdGetItem" runat="server" Height="24px"
                              Text="بررسي آيتمcache شده"
                              Width="180px" Font-Names="Tahoma" /><br /><br />
           <asp:Label ID="lblInfo" runat="server" BackColor="LightYellow" BorderStyle="Groove"
                            BorderWidth="2px" Font-Names="Tahoma" Font-Size="X-Small" Height="192px"
                            Width="536px"></asp:Label>
       </div>
    </form>
   </body>
</html>

توضيحات :

• در زمان فراخواني برنامه فوق از طريق روتين Page_laod عمليات زير انجام مي شود :
- ايجاد يك شي وابسته براي جدول Employees بانك اطلاعاتي Northwind
- درج dataset حاوي ركوردهاي بازيابي شده از جدول Employees در cache
- نمايش پيام هاي مناسب در خروجي به كمك كنترل سرويس دهنده label ( با نام lblInfo )
• روتين cmdGetItem_Click ، وجود آيتم مورد نظر را در Cache بررسي و در صورتي كه اين آيتم در cache موجود نباشد يك پيام خاص از طريق كنترل سرويس دهنده label در خروجي نمايش داده مي شود . در صورت وجود آيتم مورد نظر در cache ، مقدار آن از cache بازيابي و يك پيام خاص از طريق كنترل سرويس دهنده label در خروجي نمايش داده مي شود .
• روتين cmdModify_Click ، مسئوليت ايجاد تغيير در جدول Employees بانك اطلاعاتي Northwind را برعهده دارد .
سيستم آگاه سازي caching در SQL Server 2000 و SQL Server 2005
سيستم آگاه سازي caching در SQL Server 2005 وضعيت بمراتب بهتري را نسبت به SQL Server 2000 پيدا كرده است . چراكه زيرساخت سيستم فوق از طريق يك سيستم ارسال و دريافت پيام موسوم به Service Broker در بانك اطلاعاتي تعبيه شده است .
Service Broker يكي از ويژگي هاي جديد ارائه شده در SQL Server 2005 است . سيستم فوق ، در واقع يك فريمورك ارسال و دريافت پيام توزيع شده را ارائه مي نمايد . با استفاده از ويژگي فوق مي توان قابليت هاي متعددي را به بانك اطلاعاتي اضافه نمود . Service Broker از سيستم ذخيره سازي صف ( FIFO ) استفاده مي نمايد و يك لينك ارتباطي بين ارسال كننده پيام و دريافت كننده پيام ايجاد مي نمايد . سيستم فوق مديريت صف ها را برعهده داشته و شامل اشياء بانك اطلاعاتي نظير جداول ، view و stored procedure مي باشد .
پياده كنندگان با استفاده از دستور CREATE EVENT NOTIFICATION مي توانند به SQL Server 2005 آموزش دهند كه در صورت بروز رويدادهائي خاص اطلاعات لازم را براي سيستم آگاه سازي caching ارسال نمايد .
ASP. NET از يك زاويه ديگر به اين موضوع نگاه مي كند . پس از مشخص شدن يك query ، فناوري ASP. NET بطور اتوماتيك به SQL Server 2005 اعلام مي نمايد كه اطلاعات آگاه سازي را براي هر نوع عملياتي كه مي تواند بر روي نتيجه query تاثيرگذار باشد ارسال نمايد . هر مرتبه كه يك عمليات خاص انجام شود ، SQL Server مشخص مي نمايد كه آيا اين عمليات مي تواند يك دستور ريجستر شده را تحت تاثير قرار دهد و يا خير ؟ در صورتي كه عمليات انجام شده بتواند بر روي يك دستور ريجستر شده تاثيرگذار باشد ، SQL Server يك پيام آگاه سازي را ارسال و فرآيند آگاه سازي را متوقف مي نمايد .
سيستم آگاه سازي Caching در SQL Server 2005 نسبت به SQL Server 2000 داراي مزاياي متعددي است :
• آگاه سازي بر اساس جزئيات بيشتري از اطلاعات . در مقابل غيرمعتبر سازي شي cache شده در زمان بروز تغييرات در يك جدول ، SQL Server 2005 صرفا" يك شي را زماني غيرمعتبر مي كند كه عملياتي نظير درج ، بهنگام سازي و حذف بر روي سطر مورد نظر انجام شده باشد .
• عدم ضرورت انجام عملياتي خاص براي پيكربندي و آماده سازي سيستم آگاه سازي . براي بهره برداري از سيستم آگاه سازي caching در SQL Server 2005 ضرورتي به اجراي برنامه خط دستوري aspnet_regsql و يا ذخيره تنظيمات pooling در فايل web.config وجود ندارد .
سيستم آگاه سازي فعاليت خود را بر اساس يك SELECT query و يا stored procedure آغاز مي كند . در چنين مواردي ، استفاده از SELECT query محدوديت هاي مختص به خود را داشته و از قوانين زير تبعيت مي نمايد :
• براي اجراي query بر روي يك جدول مي بايست نام آن به صورت Owner].table ] مشخص گردد . به عنوان نمونه dbo.Employees ( صرفا" نمي بايست نام جدول Employees آورده شود . )
• در query مورد نظر نمي بايست از توابعي نظير Conut ، MAX ، MIN و يا AVERAGE استفاده گردد .
• نمي توان با استفاده از wildcard تمامي ستون ها را انتخاب نمود ( نظير SELECT * FROM Employees ) . در مقابل ، مي بايست نام هر ستون دقيقا" مشخص گردد تا SQL Server بتواند تغييرات آنها را پيگيري و آندسته از ستون هائي را كه در نتيجه query تاثيرگذار هستند تشخيص دهد .
شكل صحيح استفاده از دستور Select به صورت زير است .

SELECT EmployeeID, FirstName, LastName, City FROM dbo.Employees

موارد فوق مهمترين قوانين موجود در اين رابطه مي باشند و مجموعه كامل تري را مي توان بر روي msdn مشاهده نمود . در صورت عدم رعايت يكي از قوانين اشاره شده با يك پيام خطاء مواجه نخواهيم شد و در عمل سيستم آگاه سازي caching وظايف خود را به درستي انجام نخواهد داد . توجه داشته باشيد كه پيام آگاه سازي بلافاصله پس از ريجستركردن دستور ، ارسال و آيتم cache شده غيرمعتبر مي گردد .

مقداردهي اوليه سرويس caching

قبل از اين كه بتوان از سيستم آگاه سازي caching در SQL Server 2005 استفاده كرد، مي بايست عمليات زير را انجام داد :
• فعال كردن SQL Server Service Broker . در صورتي كه Service Broker براي بانك اطلاعاتي مورد نظر فعال نشده باشد در زمان اجراي يك برنامه وب كه قصد استفاده از سيستم آگاه سازي caching در SQL Server 2005 را دارد ‌، با پيام خطاء زير مواجه خواهيم شد :

Server Error in '/WebSite4' Application.
The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported.  Please enable the Service Broker for this database if you wish to use notifications.

• براي حل مشكل فوق كافي است كه Service Broker را براي بانك اطلاعاتي مورد نظر فعال نمود . بدين منظور مي توان از دستور زير در SQL Server استفاده نمود :

ALTER DATABASE [Northwnd] SET  ENABLE_BROKER ;
GO

• پس از اجراي دستور فوق اين احتمال وجود خواهد داشت كه مجددا" با يك پيام خطاء ديگر مواجه شويم :

Msg 9776, Level 16, State 1, Line 2

Cannot enable the Service Broker in database "Northwnd" because the Service Broker
GUID in the database (B4201B09-6358-4C65-8457-D6F50004A4D9) does not match the one
 in sys.databases (2527A339-BFB3-45C6-978D-412C4FA557CB).

Msg 5069, Level 16, State 1, Line 2

ALTER DATABASE statement failed.

• علت بروز اين خطاء بدين دليل است كه عملياتي بر روي بانك اطلاعاتي ( به عنوان نمونه Northwind ) بدون دنبال نمودن صحيح فرآيندهاي آن انجام شده است . به عنوان مثال جايگزيني فايل هاي mdf . و ldf . از بانك هاي ديگر . توجه داشته باشيد كه مي بايست همواره از رويه اي صحيح براي move و copy بانك اطلاعاتي استفاده كرد ( استفاده از attach/detach و يا backup/restore ) .
با توجه به موارد فوق نمي توان broker موجود را بر روي بانك اطلاعاتي Northwind فعال نمود و مي بايست يك نمونه جديد را با استفاده از دستور زير ايجاد نمود :

ALTER DATABASE [Northwnd] SET NEW_BROKER ;
GO

• براي اطمينان از فعال شدن service broker مي توان از query زير استفاده كرد. در صورتي كه مقدار يك برگرداند شود ، اين سرويس بر روي بانك اطلاعاتي Northwind فعال شده است .

select is_broker_enabled from sys.databases where name = 'Northwnd'

• فراخواني متد SqlDependency.Start . متد فوق مسئوليت مقداردهي اوليه سرويس listening بر روي‌ سرويس دهنده وب را برعهده دارد .

Dim connectionString As String = _
WebConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
SqlDependency.Start(connectionString)

• فراخواني متد فوق صرفا" يك مرتبه در مدت زمان حيات برنامه وب انجام مي شود و بهتر است كه در متد Application_Start فايل global.asax قرار داده شود تا زمينه فعال شدن اتوماتيك آن فراهم گردد . همچنين مي توان از متد stop براي توقف listener استفاده نمود .

ايجاد cache dependency

براي استفاده از cache dependency در SQL Server 2005 به يك گرامر متفاوت نياز است كه صرفا" شامل مشخص كردن نام جدول و بانك اطلاعاتي نمي باشد . در مقابل ، SQL Server مي بايست از دستور واقعي آگاهي يافته و نسبت به آن شناخت داشته باشد .
در صورت فعال كردن caching از طريق كد ، مي بايست با استفاده از constructor كه يك شي SqlCommand را به عنوان پارامتر دريافت مي نمايد اقدام به ايجاد SqlCacheDependency كرد .
كد زير نحوه انجام اين كار را نشان مي دهد .

Dim con As New SqlConnection(connectionString)
Dim query As String ="SELECT EmployeeID, FirstName, LastName, City FROM dbo.Employees"
Dim cmd As New SqlCommand(query, con)
Dim adapter As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
adapter.Fill(ds, "Employees")
Dim empDependency As New SqlCacheDependency(cmd)
Cache.Insert("Employees", ds, empDependency)

در صورت استفاده از دايركتيو OutputCache و يا يك كنترل منبع داده ، ASP. NET مسئوليت ريجستر كردن را بر عهده مي گيرد و پياده كنندگان مي بايست صرفا" مقدار CommandNotification را مشخص نمايند .

 <%@ OutputCache Duration="600" SqlDependency="CommandNotification" VaryByParam="none" %>

بررسي‌ يك مثال كاربردي
كد زير نحوه ايجاد cache dependency در SQL Server 2005 و بر روي بانك اطلاعاتي Northwind را نشان مي دهد . پس از فعال شدن برنامه فوق و از طريق روتين page_load ، يك وابستگي براي جدول customers ايجاد ( ماحصل اجراي دستور Select ) و ماحصل آن در cache ذخيره مي گردد . در صورت بروز هرگونه تغيير در فيلد ContactName جدول customers ( اين كار توسط روتين cmdModify_Click انجام مي شود ) اعتبار داده cache شده بطور اتوماتيك و از طريق سيستم آگاه سازي caching در SQL Server 2005 به اتمام مي رسد .

 ايجاد cachedependencyدر SQL Server 2005  

<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" Debug="true"%>
<%@ import Namespace="system.Data" %>
<%@ import Namespace="system.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
'===================================================================
 <script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  If Not Me.IsPostBack Then
    SqlDependency.Start(connectionString)
    lblInfo.Text &= "ايجاد آيتم وابسته<br />"
    Cache.Remove("Customers")
    Dim dt As DataTable = GetTable()
    lblInfo.Text &= "اضافه كردن آيتم مورد نظر بهcache<br />"
    Cache.Insert("Customers", dt, dependency)
 End If
End Sub
'===================================================================
Private dependency As SqlCacheDependency
Private connectionString As String = _
WebConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
Private Function GetTable() As DataTable
  Dim con As New SqlConnection(connectionString)
  Dim sql As String = "SELECT ContactName FROM dbo.Customers"
  Dim da As New SqlDataAdapter(sql, con)
  ' ايجاد يك وابستگي براي جدول 
  dependency = New SqlCacheDependency(da.SelectCommand)
  Dim ds As New DataSet()
  da.Fill(ds, "Customers")
  Return ds.Tables(0)
End Function
'===================================================================
Protected Sub cmdGetItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdGetItem.Click
 If Cache("Customers") Is Nothing Then
   lblInfo.Text &= "آيتم مورد نظر درcache موجود نمي باشد<br />"
 Else
  lblInfo.Text &= "آيتم مورد نظر همچنان درcache موجود است<br />"
 End If
End Sub
'===================================================================
Protected Sub cmdModify_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdModify.Click
Dim con As New SqlConnection(connectionString)
Dim sql As String = "UPDATE dbo.Customers SET ContactName='Test Contact_Name' WHERE CustomerID='WOLZA'"
Dim cmd As New SqlCommand(sql, con)
Try
  con.Open()
  cmd.ExecuteNonQuery()
Finally
con.Close()
End Try
lblInfo.Text &= " بهنگام سازي به اتمام رسيد<br />"
End Sub
'===================================================================
</script>
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
  <head id="Head1" runat="server">
     <title>Untitled Page</title>
  </head>
  <body style="font-family: Tahoma">
     <form id="form1" runat="server">
       <div>
           <asp:Button ID="cmdModify" runat="server" Height="24px"  Text="تغيير جدول"
                              Width="103px" Font-Names="Tahoma" />
           <asp:Button ID="cmdGetItem" runat="server" Height="24px"
                              Text="بررسي آيتمcache شده"
                              Width="180px" Font-Names="Tahoma" /><br /><br />
           <asp:Label ID="lblInfo" runat="server" BackColor="LightYellow" BorderStyle="Groove"
                            BorderWidth="2px" Font-Names="Tahoma" Font-Size="X-Small" Height="192px"
                            Width="536px"></asp:Label>
       </div>
    </form>
   </body>
</html>

مشكلات احتمالي در خصوص سيستم آگاه سازي caching

در صورتي كه هرگز اعتبار آيتم cache شده به پايان نرسد ، سرويس polling در ASP. NET يك پيام غيرمعتبرسازي را دريافت نمي نمايد . اين مشكل مي تواند دلايل متعددي داشته باشد . فعال نشدن CLR براي SQL Server يكي از متداولترين مشكلات موجود در اين رابطه است .
رويه اي كه پيام هاي آگاه سازي را ارسال مي نمايد يك رويه دات نت است و به حمايت آن نياز دارد . براي فعال كردن CLR ، مي توان از پنجره خط دستور ويژوال استوديو دات نت 2005 استفاده كرد و دستور SqlCmd.exe را تايپ كرد .
كد زير نحوه فعال كردن دستور فوق را براي SQL Server 2005 Express Edition نشان مي دهد :

  SqlCmd -S localhost\SQLEXPRESS

در صورت استفاده از نسخه كامل SQL Server 2005 ، لازم نيست از instance name استفاده شود ( استفاده از localhost در مقابل localhost\SQLEXPRESS ) .
همچنين ممكن است با توجه به محل نصب بانك اطلاعاتي لازم باشد كه نام سرويس دهنده تغيير يابد . در دستور قبلي ، فرض بر اين است كه بانك اطلاعاتي بر روي كامپيوتر جاري نصب شده است .
برنامه كاربردي SqlCmd.exe يك پرامپت دستوري را ارائه مي نمايد كه مي توان از آن به منظور درج دستورات SQL استفاده كرد . براي فعال كردن CLR از دستورات زير استفاده مي گردد .

EXEC sp_configure 'show advanced options', '1'
GO
RECONFIGURE
GO
EXEC sp_configure 'clr enabled', 1
GO
RECONFIGURE

در ادامه و با تايپ دستور quit مي توان از برنامه SqlCmd.exe خارج شد.
در صورتي كه اعتبار آيتم cache شده بلافاصله به اتمام برسد ، اين احتمال وجود دارد كه از قوانين اشاره شده در ارتباط با نوشتن query تبعيت نشده باشد .

سخن آخر

طراحان و پياده كنندگان برنامه هاي وب با بكارگيري مجموعه اي از ترفندها ، فناوري ها و رعايت برخي نكات كليدي مي توانند برنامه هائي را با كارآئي مطلوب طراحي و پياده سازي نمايند . با توجه به جايگاه مهم لايه داده در برنامه هاي وب ، مي بايست بر روي لايه فوق با دقت بيشتري متمركز و اقدامات لازم را در زمان طراحي و پياده سازي انجام داد .
پياده كنندگان برنامه هاي وب با نوشتن چندين خط كد اضافه مي توانند قابليت رشد و كارآئي برنامه هاي خود را بطرز چشمگيري افزايش دهند .
استفاده از ابزارهاي تست و پروفايلينگ حداقل شرايط لازم به منظور بررسي قابليت هاي يك برنامه وب كارآ را فراهم مي نمايد تا بتوان قبل از عملياتي شدن مشكلات و گره هاي حساس تاثيرگذار بر روي‌ كارآئي برنامه را شناسائي و در جهت رفع آنها تلاش كرد .
Add Comments
Name:
Email:
User Comments:
SecurityCode: Captcha ImageChange Image