ng خواهيم پرداخت .

افزايش كارآئي برنامه هاي وب در ASP.NET 2.0 (بخش هفتم)
آنچه تاكنون گفته شده است :
بخش هاي اول و دوم : اشاره به مجموعه اي از نكات كه رعايت آنها در زمان طراحي مي تواند زمينه پياده سازي يك برنامه وب كارآ را فراهم نمايد .
بخش سوم : معرفي برخي ابزارها براي تست برنامه هاي وب
بخش چهارم : مفاهيم اوليه caching ، روش هاي caching در ASP.NET ، نحوه استفاده از output caching
بخش پنجم : Caching و Query string
بخش ششم : Custom Caching Control
در اين بخش به بررسي data caching خواهيم پرداخت .
caching داده
caching داده ، انعطاف پذيرترين نوع caching است كه استفاده از آن مستلزم انجام مراحلي خاص در برنامه است . پياده كنندگان برنامه هاي وب مي توانند با استفاده از پتانسيل فوق آيتم هائي را كه هزينه ايجاد آنها گران است به شي cache اضافه نمايند .
cache يك خصلت از كلاس صفحه است و نمونه اي از كلاس System.Web.Caching.Cache را بر مي گرداند . عملكرد شي فوق شباهت زيادي با شي Application دارد ( نظير دستيابي به آن در تمامي صفحات توسط سرويس گيرندگان مختلف ) . علي رغم وجود شباهت هاي زياد ، دو شي Application و Cache داراي تفاوت هائي اساسي با يكديگر مي باشند :
شي Cache از نوع thread-safe است . اين بدان معني است كه پياده كنندگان لازم نيست با صراحت عمليات lock و unlock شي cache را قبل از اضافه كردن و يا حذف يك آيتم از cache انجام دهند . به عنوان نمونه ، در صورت ايجاد يك شي سفارشي ممكن است در يك لحظه بيش از يك سرويس گيرنده قصد استفاده از آن را داشته باشند . در چنين مواردي اين احتمال وجود خواهد داشت كه شرايط استفاده از داده غيرمعتبر براي هر يك از سرويس گيرندگان فراهم گردد . براي غلبه بر محدوديت فوق مي توان از روش هاي مختلفي استفاده نمود . ايجاد يك نسخه ديگر از شي به منظور استفاده از آن در يك صفحه ، يكي از ساده ترين راهكارهاي موجود در اين زمينه است .
آيتم هاي موجود در شي Cache بطور اتوماتيك از آن حذف مي گردند . ASP.NET يك آيتم را پس از اتمام مدت زمان اعتبار آن ، در صورت تغيير يكي از اشياء و يا فايل هاي وابسته و يا كمبود حافظه سرويس دهنده از cache خارج مي نمايد . اين بدان معني است كه پياده كنندگان مي توانند با خيالي آسوده از cache استفاده نمايند بدون اين كه نگران از دست دادن منبع ارزشمند حافظه باشند چراكه ASP.NET در صورت نياز آيتم ها را از حافظه خارج خواهد كرد . با توجه به اين كه همواره اين احتمال وجود دارد كه آيتم هاي ذخيره شده از cache خارج شده باشند مي بايست همواره قبل از دستيابي ، موجود بودن آنها در cache بررسي گردد .
آيتم هاي موجود در cache از وابستگي ها ( dependencies ) حمايت مي نمايند . پياده كنندگان مي توانند يك شي cache شده را به يك فايل ، يك جدول بانك اطلاعاتي و يا يك منبع ديگر مرتبط نمايند . در صورت بروز تغييرات در منبع وابسته ، شي cache شده بطور اتوماتيك غيرمعتبر مي گردد و در نهايت از حافظه حذف مي شود .
اضافه كردن آيتم به cache
براي اضافه كردن يك شي درون cache از روش هاي مختلفي استفاده مي گردد . يكي از روش هاي موجود نسبت دهي داده مورد نظر به يك نام و ذخيره آن در شي cache است ( نظير كار با اشياء Session و Application ) . با توجه به اين كه در اين روش نمي توان براي شي cache شده يك مدت زمان خاص را مشخص نمود ، استفاده از اين روش كمتر توصيه شده است
Cache(“KeyName”) = objectToCache
يكي ديگر از روش هاي درج داده درون شي cache ، استفاده از متد Insert است . متد فوق داراي چهار نسخه خاص است . در جدول زير ، گرامر يكي از نسخه هاي فوق كه جزئيات بيش تري از كار را با بكارگيري پنچ پارامتر مشخص مي نمايد، نشان داده شده است .
Cache.Insert(key, item, dependencies, absoluteExpiration, slidingExpiration)
در جدول زير عملكرد هر يك از پارامترهاي متد Insert توضيح داده شده است .
پارامتر
عملكرد
Key
نام در نظر گرفته شده براي آيتم Cache شده را مشخص مي نمايد. بدين ترتيب ، امكان دستيابي به آيتم Cache شده بر اساس نام فراهم گردد.
Item
شي واقعي كه قصد caching آن را داريم ، مشخص مي نمايد .
dependencies
يك شي CacheDependency كه به شما اجازه مي دهد يك وابستگي براي آيتم مورد نظر در cache را ايجاد نمائيد .
در صورتي كه قصد تعريف يك آيتم وابسته را نداريم ، مقدار اين پارامتر مي بايست null در نظر گرفته شود .
absoluteExpiration
يك شي DataTime كه زمان و تاريخ خارج كردن آيتم cache شده از cache را مشخص مي نمايد .
slidingExpiration
يك شي TimeSpan كه مدت زمان انتظار بين درخواست هاي متوالي در صورت عدم استفاده از داده cache شده جهت خروج از cache را مشخص مي نمايد .
به عنوان مثال ، در صورتي كه اين مقدار 20 دقيقه در نظر گرفته شود و در مدت زمان فوق هيچگونه درخواستي براي داده فوق دريافت نگردد ،‌ ASP.NET آن را از حافظه خارج خواهد كرد .
جدول 1 : پارامترهاي متد Insert
معمولا” از تمامي پارامترهاي فوق در يك زمان استفاده نمي گردد . به عنوان مثال ، Cache dependencies يك ابزار خاص است كه به كمك آن مي توان وابستگي يك آيتم cache شده به ساير منابع تاثيرگذار را مشخص نمود .
در صورتي كه قصد استفاده از يك absolute expiration را داشته باشيم ، مي بايست مقدار پارامتر slidingExpiration معادل TimeSpan.Zero در نظر گرفته شود.
Cache.Insert(“MyItem”, obj, Nothing,DateTime.Now.AddMinutes(60), TimeSpan.Zero)
در صورتي كه مطمئن باشيم اطلاعات موجود در يك آيتم cache شده در يك بازه زماني خاص معتبر باقي مي ماند ( نظير يك گزارش هواشناسي ) ، استفاده از absolute expiration توصيه مي گردد . در صورتي كه داده ذخيره شده در cache همواره معتبر باشد ( نظير كاتولوگ يك محصول ) ، استفاده از Sliding expiration توصيه مي گردد . به عنوان يك سياست مطلوب در خصوص بكارگيري Sliding expiration ، مي توان مقدار پارامتر absoluteExpiration را به DateTime.Max نسبت داد .
Cache.Insert(“MyItem”, obj, Nothing,DateTime.MaxValue, TimeSpan.FromMinutes(10))
يك مثال كاربردي
در برنامه زير يك سيستم caching داده ساده پياده سازي شده است . در اين مثال يك آيتم با نام TestItem كه تاريخ و زمان جاري را در خود نگهداري مي نمايد به مدت
30 ثانيه cache مي گردد . پس از postback صفحه ، در صورتي كه تاريخ اعتبار آيتم ذخيره شده در cache به اتمام نرسيده باشد ، مقدار آن از cache بازيابي و در خروجي نمايش داده مي شود . پس از اتمام تاريخ اعتبار آيتم ذخيره شده در cache ، مجددا” و بر اساس داده جديد ( تاريخ جديد سيستم ) آيتم مورد نظر ايجاد و جهت استفاده آتي در cache ذخيره مي گردد .
ذخيره و بازيابي داده در شي cache
%@ Page Language=”VB” Culture=”fa-IR” UICulture=”fa-IR” %



تست caching داده


شكل زير خروجي برنامه فوق را نشان مي دهد .

شكل 1 : ذخيره و بازيابي داده در شي cache
در بخش هشتم بحث خود را بر روي data caching ادامه خواهيم داد .

افزايش كارآئي برنامه هاي وب در ASP.NET 2.0 (بخش هشتم)
آنچه تاكنون گفته شده است :
بخش هاي اول و دوم : اشاره به مجموعه اي از نكات كه رعايت آنها در زمان طراحي مي تواند زمينه پياده سازي يك برنامه وب كارآ را فراهم نمايد .
بخش سوم : معرفي برخي ابزارها براي تست برنامه هاي وب
بخش چهارم : مفاهيم اوليه caching ، روش هاي caching در ASP.NET ، نحوه استفاده از output caching
بخش پنجم : Caching و Query string
بخش ششم : Custom Caching Control
بخش هفتم : caching داده و نحوه استفاده از شي cache
در اين بخش بحث خود را بر روي data caching ادامه خواهيم داد .
در بخش هفتم براي آشنائي با نحوه عملكرد شي cache به بررسي يك نمونه مثال كاربردي پرداختيم كه در آن داده مورد نظر براي مدت زمان خاصي در cache مستقر مي گرديد . در ادامه و به منظور پاسخ به درخواست سرويس گيرندگان از داده ذخيره شده در cache مشروط به عدم اتمام تاريخ اعتبار آن استفاده مي گرديد . در صورت اتمام تاريخ مصرف نسخه cache شده ، داده جديد توليد و مجددا” در cache قرار مي گرفت . در اين مثال صرفا” يك داده ساده در cache قرار مي گرفت .
شايد براي شما اين سوال مطرح شده باشد كه آيا مي توان اطلاعات پيچيده تري نظير داده بازيابي شده از يك بانك اطلاعاتي را نيز بدين شكل در cache قرار داد تا بتوان از آن براي پاسخ به ساير سرويس گيرندگان استفاده نمود ؟ آيا مي توان يك سيستم فيلترينگ را بر اساس داده هاي cache شده پياده سازي نمود بگونه اي كه متناسب با خواسته كاربر بخشي از داده cache شده در اختيار وي قرار داده شود ؟ اجازه دهيد با بررسي يك مثال كاربردي به سوالات فوق پاسخ دهيم .
مثال : ايجاد caching با قابليت مشاهده چندين view از داده
در اين مثال اطلاعات مورد نظر از يك بانك اطلاعاتي ( به عنوان نمونه Northwind ) بازيابي و پس از ذخيره در يك DataSet در يك Gridview نمايش داده مي شود . DataSet در cache ذخيره مي گردد تا در آينده و قبل از اتمام تاريخ اعتبار آن بتوان از تمام و يا بخشي از اطلاعات آن متناسب با خواسته كاربر استفاده نمود .
خروجي صفحه وب بر اساس خواسته كاربر و به صورت پويا ايجاد مي گردد . در واقع ، كاربر است كه مشخص مي كند در خروجي قصد مشاهده چه نوع اطلاعاتي را دارد . خروجي برنامه فوق در چندين ستون مختلف مي تواند نمايش داده شود . كاربر با انتخاب يك و يا چندين ستون نظر خود را خصوص نحوه نمايش خروجي مشخص مي نمايد .
توضيحات برنامه :
DataSet از طريق يك تابع اختصاصي و به صورت زير ايجاد مي گردد .
ايجاد DataSet به كمك يك تابع اختصاصي
Function RetrieveData() As DataSet
Dim connectionString As String = _
WebConfigurationManager.ConnectionStrings(“NORTHWNDConnectionString”).ConnectionString
Dim SQLSelect As String = “SELECT * FROM Customers”
Dim con As New SqlConnection(connectionString)
Dim cmd As New SqlCommand(SQLSelect, con)
Dim adapter As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
Try
con.Open()
adapter.Fill(ds, “Customers”)
Finally
con.Close()
End Try

Return ds
End Function
در اولين مرتبه اي كه صفحه load مي گردد ، ليستي از ستون ها توسط يك كنترل CheckBoxList با نام

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