افزايش كارآئی برنامه های وب در ASP.NET 2.0 New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 سه شنبه  10  اسفند  1395  2017  Feb.  28   Tuesday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 افزايش كارآئی برنامه های وب در ASP.NET 2.0 (بخش نهم)

 مديريت وب

8136

4

4

با توجه به جایگاه داده در عصر حاضر و  لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر  روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و  خدمات خود  را از طریق  سایت www.fabak.ir  به مخاطبان محترم عرضه می نماید

 

افزايش كارآيی برنامه های وب در ASP.NET 2.0

افزايش كارآئی برنامه های وب در ASP.NET 2.0 (بخش نهم)
آنچه تاكنون گفته شده است :

  • بخش های اول  و دوم  : اشاره به مجموعه ای از نكات كه رعايت آنها در زمان طراحی می تواند زمينه پياده سازی يك برنامه وب كارآ را فراهم نمايد .
  • بخش سوم  : معرفی برخی ابزارها برای تست برنامه های وب
  • بخش چهارم : مفاهيم اوليه caching ، روش های caching در ASP.NET ، نحوه استفاده از output caching
  • بخش پنجم :  Caching و Query string
  • بخش ششم : Custom Caching Control
  • بخش هفتم : caching داده و نحوه استفاده از شی cache
  • بخش هشتم : بررسی يك مثال جهت ايجاد caching با قابليت مشاهده چندين view از داده

در اين بخش  بحث خود را بر روی 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) خواهيم پرداخت .



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382