|
عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
|
افزايش كارآئی برنامه های وب در ASP.NET 2.0 (بخش نهم) |
مديريت وب |
4010 |
1 |
5 |
افزايش كارآيی برنامه های وب در 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) خواهيم پرداخت .