PDA

View Full Version : سوال: نحوه ارجاع غیر مستقیم به یک شی موجود در Cache



Chabok
چهارشنبه 05 اسفند 1388, 13:37 عصر
با سلام

برای استفاده از Cache اکثراً چنین روشی را پیاده می کنند :

یک سری اطلاعات از یک منبع خوانده می شود و Cache می شود .
هنگام نیاز به این اطلاعات در صورتی که بر روی Cache موجود باشد از آن خوانده می شود .
در غیر این صورت مجدداً از منبع اصلی خوانده می شود و بر روی Cache نیز ذخیره می شود .

من برای Cache کردن یک DataTable این کار را توسط Property بصورت زیر انجام داده ام :


private static DataTable SetDT
{
set
{
if (value != null)
{
//Remove previous info from cache
if (SetDT != null) HTP.Cache.Remove("ChbSetDT");
//insert into cache
HTP.Cache.Add("ChbSetDT", value, null, DateTime.Now.AddMonths(1)
, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}
}
get
{
if (HTP.Cache.Get("ChbSetDT") != null)
return (DataTable)HTP.Cache.Get("ChbSetDT");
else return null;
}
}نکته : HTP در این جا یک Property بصورت Readonly است که HttpContext.Current را برگشت می دهد .

برای مثال در یک متد دیگر که وظیفه مدیریت این شی را دارد در صورت null بودن اولیه ، آن را Fill می کند و در نتیجه توسط این Property در Cache ذخیره می شود و مشکلی هم نیست .

حال سوال من این است که اگر محتویات این DataTable را که در واقع ارجاع به Cache دارد را تغییر دهیم چه اتفاقی می افتد ؟


SetDT.Rows[0][0] = "Salam";آیا هنگام اجرای این کد ، شی موجود در Cache بصورت خودکار تغییر میکند ؟
زیرا SetDT که از نوع DataTable است شی موجود در Cache را return می کند .

آیا اگر قصد ما تغییرات در شی باشد ، نحوه نوشتن Property بالا صحیح است ؟
یا باید در صورت تغییرات ، کل شی مجدداً توسط Cache.Insert بازنویسی شود ؟

چون در حال حاضر این کد جواب می دهد.
ولی میخواستم بدونم از نظر فنی این ارجاع غیر مستقیم به چه شکلی عمل می کند ؟

با تشکر

Saber_Fatholahi
چهارشنبه 05 اسفند 1388, 13:47 عصر
نه دوست من هیچ چیزی توی کش با تغییر منبع شما تغییر نمیکند
درواقع یه کپی از خروجی شما از هر منبعی که باشد توی کش ذخیره میشه
به همین دلیل شما باید در زمان اضافه کردن یک رکورد، حذف و بروز رسانی یک رکورد داده مورد نظر از کش پاک کنین که کاربر اطلاعات غلط دریافت نکنه
موفق باشین

ali_kolahdoozan
چهارشنبه 05 اسفند 1388, 14:12 عصر
باید دستی کش رو خالی کنی .تغییر در dt سبب تغییر در مقادیر ذخیره شده در کش نمیشه

Behrouz_Rad
چهارشنبه 05 اسفند 1388, 17:50 عصر
من هم یک مورد رو اضافه کنم. خط ذیل در قسمت Get صحیح نیست:


if (HTP.Cache.Get("ChbSetDT") != null)
return (DataTable)HTP.Cache.Get("ChbSetDT");

زمان خالی شدن Cache بر روی سرور رو نمیشه دقیقاً تعیین کرد.
شما در شرط if سعی کردی null نبودن Cache رو قبل از دسترسی به اون بررسی کنی و در صورت وجود، در خط دوم به اون دسترسی پیدا کردی. به دلیل اینکه زمان از بین رفتن Cache مشخص نیست، ممکنه بلافاصله بعد از اینکه شرط null نبودن صحیح بود و سعی کردی به Cache دسترسی پیدا کنی، Cache حذف بشه!
بنابراین کد صحیح به شکل ذیل هست:


DataTable dt = HTP.Cache.Get("ChSetDT") as DataTable
if (dt != null)
{
return dt;
}

با استفاده از as، به صورت امن Cache رو به دست میاری.

موفق باشید.

Chabok
چهارشنبه 05 اسفند 1388, 20:13 عصر
با تشکر از همگی دوستان

ولی ظاهراً این اتفاق داره میفته .

من یک مثال آماده کردم .

http://barnamenevis.org/forum/attachment.php?attachmentid=44626&stc=1&d=1267030979

FillCache : یک dataTable میسازه و در Cache ذخیره میکنه .

EditCache : توسط کد زیر این DataTable را تغییر می دهد .

(Cache.Get("MYTbl") as DataTable).Rows[0][1] = "rec 1 new";

Bind From Cache : مقدار dataTable موجود در cache را روی یک GridView نمایش می دهد .

GridView1.DataSource = (DataTable)Cache.Get("MYTbl");
GridView1.DataBind();

اگر ابتدا Fill Cache و سپس Bind From Cache را بزنیم نتیجه این است :
http://barnamenevis.org/forum/attachment.php?attachmentid=44627&stc=1&d=1267031439
و اگر حال EditCache را زده و سپس Bind From Cache را بزنیم نتیجه تغییر می کند .:لبخند:
http://barnamenevis.org/forum/attachment.php?attachmentid=44628&stc=1&d=1267031439

این یعنی مقدار موجود در cache تغییر کرده ؟
و اگر واقعاً تغییر نکرده پس این مقدار جدید در کجا نگهداری می شود ؟

پروژه ضمیمه شده است .
با تشکر

ali_kolahdoozan
چهارشنبه 05 اسفند 1388, 21:41 عصر
حج محسن باز هم اینو بزار روی سرور و واقعا تستش کن و برای چند کاربر همزمان بزار بره جلو ببین چه خبره . حج محسن حرف گوش بده

Saber_Fatholahi
جمعه 07 اسفند 1388, 10:57 صبح
یه برنامه کامل به صورت سه لایه توپ آماده کردم وقت کنم در اسرع وقت اپلود می کنم
کاملا کشینگ توی اون رعایت شده
موفق باشین

Chabok
دوشنبه 10 اسفند 1388, 21:24 عصر
با سلام

من همین سورس را روی هاست هم گذاشتم

ظاهراً داره کار میده و تغییرات در cache روی منبع اعمال میشه .

http://chaboksoft.com/testcache

نظرات ؟ پیشنهادات ؟ انتقادات ؟ :لبخند: