PDA

View Full Version : استفاده از SQLCahceDependecy



nazaninam
چهارشنبه 17 مهر 1387, 09:36 صبح
سلام
من در یک پروژه از Cache استفاده می کنم و دیتاست هایی که از لایه DAL میگیرم داخل کش ذخیره می کنم و لایه UI اطلاعات رو از لایه CL یا کش دریافت می کنه .
در این لایه از SQLCahceDependecy استفاده نکردم و برای Cache ها Duration تعریف کردم .
میخواستم بدونم استفاده از SQLCahceDependecy چقدر به SQL Server فشار میاره ؟

چقدر میتونه روی Performace تاثیر بگذاره ؟
آیا اساتید استفاده از اونو پیشنهاد میکنند یا خیر ؟
ممنون

Behrouz_Rad
چهارشنبه 17 مهر 1387, 11:35 صبح
بستگی به تعداد درخواست ها در لحظه داره. اگر تعدادشون کمه توصیه میشه.

موفق باشید.

nazaninam
چهارشنبه 17 مهر 1387, 11:46 صبح
فرض کنیم درخواست ها کم باشند .
اگر از یک Duration زیاد استفاده کنم چی ؟ مشکلی پیش میاد ؟

Behrouz_Rad
چهارشنبه 17 مهر 1387, 12:02 عصر
منظورت از استفاده از Duration برای Dependency هست؟ اگر پاسخت مثبته باید بگم که نمیشه جواب صریح به سوالاتی که مستلزم آگاهی از مجوزها و منابع سرور هست داد. ممکنه Service Broker برای یک Session توسط DBA محدود شده باشه. تعیین زمان برای Dependency تاثیری در کارایی برنامه نداره. تعداد درخواست ها مهمه. اگر فکر می کنی تعداد درخواست ها کمه، ازش استفاده کن.

موفق باشید.

nazaninam
پنج شنبه 18 مهر 1387, 08:38 صبح
نه منظورم استفاده از Duration بالا به جای استفاده از Dependency بود !
من یک منو خاص دارم که با دو Repeater تو در تو پیاده سازی شده و از دیتابیس پر میشه .
این اطللاعات به ندرت و در طی چند هفته ممکنه تغییر کنه . برای همین میخواهم از Cache استفاده کنم .
البته اول قصدم این بود که از اطلاعات را از XmlDataSource بخونم ولی مشکلاتی برام به وجود اومد که تصمیم گرفتم از کش استفاده کنم و در موقع تغییر در بانک (ویرایش ، حذف یا درج رکورد) یک متد برای حذف کش را فراخوانی کنم .

حالا شما بفرمایید
1- آیا Xml به همراه کش بهتر بود یا دیتابیس ؟
2- اگر دیتابیس به همراه کش مناسب هست از یک Absolute Cache به همراه یک Duration بالا مثلا یک هفته استفاده کنم یا یک Dependency
ممنون از راهنماییتون

Behrouz_Rad
پنج شنبه 18 مهر 1387, 10:17 صبح
این شد یک توضیح خوب!
حالا می تونم با اطمینان بهت بگم که منو رو از فایل XML بخون و از Overload دوم متد Insert که Dependency رو به یک فایل نسبت میده استفاده کن:


Cache.Insert("myCache", "myValue", new CacheDependency(Server.MapPath("myMenu.xml")));

nazaninam
شنبه 20 مهر 1387, 08:02 صبح
ایول ممنون عالی بود
اگر برای بایند منو از XmlDataSource استفاده کنم چی ؟ اون خودش Dependency رو هندل می کنه ؟
(ببخشید انقدر این مطلب رو طول دادم ... خیلی مسئله مهمی هست)
میتونم بپرسم چرا Xml رو به Db با این اطمینان ترجیح میدی ؟

Behrouz_Rad
شنبه 20 مهر 1387, 13:14 عصر
بگذار جزئی تر بررسی کنیم.
تو یک منو داری که که آیتم های اون از یک منبع داده پر میشن و ممکنه چند هفته طول بکشه تا اطلاعات مرتبط با ایجاد این منوها تغییر کنند.
همون طور که بهت گفتم، یک فایل XML برای این حالت رو پیشنهاد می کنم. استفاده از دیتابیس کمی قضیه رو پیچیده می کنه. چه از لحاظ ساختار منوها، چه از لحاظ مدیریت Cache.
کلاً اصل بر اینه که هر جا میشه از فایل به جای دیتابیس استفاده کنی، از فایل استفاده کن. هزینه ی I/O از هزینه ی ارتباط با دیتابیس کمتره.
ترجیح من بر این هست که از XML استفاده کنی.

و اما در مورد Cache و Dependency.
روشی که گفتم خوبه اما XmlDataSource هم گزینه ی خوبیه چون هم از Caching پشتیبانی می کنه و هم از Dependency. اما کمی دردسر بیشتری داره.
اگر قصد داری از XmlDataSource استفاده کنی، باید از یک ترفند استفاده کنی. خاصیت CacheKeyDependency کنترل XmlDataSource رو برابر با یک نام دلخواه که این نام، کلید Cache هست قرار بده و در Page_Load، زمان ویرایش فایل XML (یعنی Modified Date) رو بهش نسبت بده:


// Page_Load
if (Cache[myXmlDataSource.CacheKeyDependency] == null)
{
Cache[myXmlDataSource.CacheKeyDependency] = // Modified Date of XML file
}

هر وقت محتویات فایل XML تغییر کرد، مقدار Modified Date رو به اون کلید Cache نسبت بده. با این ترفند، بلافاصله بعد از ویرایش محتویات فایل XML، محتویات جدید بازیابی میشن و مجدداً در Cache قرار میگیرن.

البته متد Insert، دیگه این دردسرها رو نداره و خودش تغییر فایل رو بررسی می کنه.

موفق باشید.

nazaninam
شنبه 20 مهر 1387, 13:36 عصر
ممنون واقعا مثل همیشه عالی و بی نقص بود