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


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


توجه داشته باشيد در صورت عدم استفاده از 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 استفاده نمود .
رردر بخش دهم بحث خود را بر روي data caching ادامه داده و به بررسي caching با وابستگي (Dependency) خواهيم پرداخت .

افزايش كارآئي برنامه هاي وب در ASP.NET 2.0 (بخش دهم)
آنچه تاكنون گفته شده است :
بخش هاي اول و دوم : اشاره به مجموعه اي از نكات كه رعايت آنها در زمان طراحي مي تواند زمينه پياده سازي يك برنامه وب كارآ را فراهم نمايد .
بخش سوم : معرفي برخي ابزارها براي تست برنامه هاي وب
بخش چهارم : مفاهيم اوليه caching ، روش هاي caching در ASP.NET ، نحوه استفاده از output caching
بخش پنجم : Caching و Query string
بخش ششم : Custom Caching Control
بخش هفتم : caching داده و نحوه استفاده از شي cache
بخش هشتم : بررسي يك مثال جهت ايجاد caching با قابليت مشاهده چندين view از داده
بخش نهم : كنترل هاي منبع داده و caching
در اين بخش بحث خود را بر روي data caching ادامه داده و به بررسي caching با وابستگي (Dependency) خواهيم پرداخت .
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” %



تست caching





خروجي مثال فوق در شكل 1 نشان داده شده است .

شكل 1 : ايجاد caching وابسته به يك شي ( فايل )
توضيحات :
در زمان فراخواني برنامه فوق از طريق روتين 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

دیدگاهتان را بنویسید