تبلیغات
آموزشASP.NET - افزایش كارآئی برنامه های وب در ASP.NET 2.0 (بخش نهم)
 
فردا روشن اسن به
آموزشASP.NET
صفحه نخست         تماس با مدیر         پست الکترونیک        RSS         ATOM
 
 

در این بخش  بحث خود را بر روی data  caching ادامه داده و به بررسی كنترل های منبع داده و caching خواهیم پرداخت .

كنترل های ObjectDataSource ، SqlDataSource و XmlDataSource بطور ذاتی از امكانات caching حمایت می نمایند . استفاده از  caching به همراه كنترل های فوق اكیدا" توصیه می گردد چراكه برخلاف كد سفارشی نوشته شده توسط پیاده كنندگان به منظور دستیابی داده ، كنترل های منبع داده همواره در هر postback یك query را بر روی منبع داده اجراء می نمایند .
كنترل های فوق ، همچنین برای هر كنترل نسبت دهی یك query در سطح منبع داده را اجراء می نمایند . به عنوان نمونه اگر در یك صفحه از سه كنترل نسبت دهی داده در ارتباط با یك منبع داده یكسان استفاده شده باشد ، سه query مجزاء بر روی بانك اطلاعاتی و قبل از تفسیر و ارسال صفحه برای سرویس گیرنده ، اجراء خواهد شد . بدیهی است حتی با استفاده از امكانات اندك caching به همراه كنترل های منبع داده  ، شاهد بهبود چشمگیر كارآئی و كاهش load عملیاتی در سمت سرویس دهنده خواهیم بود .

با این كه تعداد زیادی از كنترل های منبع داده از caching حمایت می نمایند ، ولی ویژگی فوق به عنوان یك ضرورت در بكارگیری كنترل های منبع داده مطرح نمی گردد و می توان از كنترل های منبع داده ئی كه از پتانسیل caching حمایت نمی نمایند نیز استفاده كرد .
برای حمایت از caching كنترل های  ObjectDataSource ، SqlDataSource و XmlDataSource  از خصلت های مشابهی استفاده می نمایند . در جدول 1 ، خصلت های فوق نشان داده شده اند . 

خصلت

عملكرد

 EnableCaching

 با نسبت دهی مقدار True به خصلت فوق ، پتانسیل caching فعال می گردد . مقدار پیش فرض خصلت فوق False در نظر گرفته می شود . 

CacheExpirationPolicy

 سیاست و یا استراتژی زمان اتمام تاریخ اعتبار cache را مشخص می نماید . بر این اساس می توان مقدار خصلت فوق را ثابت و یا متغیر ( مدت زمان بین دو درخواست متوالی ) در نظر گرفت . 

 CacheDuration

 مدت زمان caching آیتم مورد نظر در cache را بر حسب ثانیه  مشخص می نماید .


CacheKeyDependency
و
SqlCacheDependency

 امكان ایجاد یك وابستگی بین یك آیتم cache شده با آیتم دیگر در data cache  ( با استفاده از CacheKeyDependency ) و یا یك جدول بانك اطلاعاتی(با استفاده از SqlCacheDependency ) را فراهم می نماید .  

جدول 1 : خصلت های caching كنترل های منبع داده

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





نوع مطلب :
برچسب ها :
لینک های مرتبط :


شنبه 18 شهریور 1396 07:27 ب.ظ
I loved as much as you'll receive carried out right here.

The sketch is tasteful, your authored subject matter stylish.
nonetheless, you command get bought an nervousness over that you wish
be delivering the following. unwell unquestionably come further formerly again as exactly the same
nearly very often inside case you shield this hike.
چهارشنبه 15 شهریور 1396 02:34 ب.ظ
great issues altogether, you simply won a new reader.
What could you recommend in regards to your publish that you just
made a few days ago? Any certain?
چهارشنبه 1 شهریور 1396 10:56 ق.ظ
Hi there just wanted to give you a quick heads up.
The text in your content seem to be running off the
screen in Firefox. I'm not sure if this is a format issue or something
to do with internet browser compatibility but I figured I'd post to let you know.

The style and design look great though! Hope you get the issue solved soon. Cheers
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر


درباره وبلاگ

سلام من آرش کاکاوند دانشجوی رشته کامپیوتر هستم و ورود شما رابه دنیای aspخوش امدمیگم.حتما نظر بدین تا من کارم رو بهتر ادامه بدم

مدیر وبلاگ : ارش کاکاوند
مطالب اخیر
نویسندگان
صفحات جانبی
نظرسنجی
شما کدام یک از برنامه های زیر را برای طراحی وب انتخاب می کنید؟








جستجو

آمار وبلاگ
کل بازدید :
بازدید امروز :
بازدید دیروز :
بازدید این ماه :
بازدید ماه قبل :
تعداد نویسندگان :
تعداد کل پست ها :
آخرین بازدید :
آخرین بروز رسانی :