نمایش نتایج 1 تا 10 از 10

نام تاپیک: Caching in CActiveDataProvicer

  1. #1

    لغو کردن یک کش کوئری

    به نام خدا، سلام

    $dependecy = new CDbCacheDependency('SELECT MAX(update_time) FROM {{post}}')
    CActiveDataProvider(Post::model()->cache($duration, $dependecy, 2), array (
    'criteria' => array (
    'condition' => 'status = 1',
    'order' => 'DESC create_time',
    ) 'pagination' => array (
    'pageSize' => 20,
    ) ));

    در کد بالا تعداد کوئری که باید از کش فراخوانی بشن رو برابر دو قرار گرفته. یکی برای count گرفتن از جدول جهت pagination و یکی هم برای واکشی رکوردها.
    مشکل اینجاست، هنگامی که رکوردی در جدول دیتابیس نداشته باشیم، کوئری دوم اجرا نمیشه و نگه داشته میشه برای کوئری بعدی دیتا بیس. که این باعث میشه کوئری بعدی به دیتابیس هم کش بشه، در حالی که نمیخوایم از کش استفاده کنیم. چطور میشه این مشکل رو حل کرد؟ چطوری میشه کوئری باقیمانده در کش رو لغو کرد؟
    آخرین ویرایش به وسیله Muhammad-Ali : شنبه 25 مرداد 1393 در 07:02 صبح

  2. #2

    نقل قول: Caching in CActiveDataProvicer

    ببینید شما الان وقتی یک رکورد درج میکنید کش باید Expire بشه چون بیشترین update_time الان فرق کرده. البته به شرط اینکه update_time رو موقع ساخت رکورد با create_time یا timestamp جاری مقداردهی کنید و NULL نباشه.

  3. #3

    نقل قول: Caching in CActiveDataProvicer

    update_time که مسلما مقدار داره. زمانی که رکوردی در جدول درج نشده باشه مشکل پیش میاد. CActiveDataProvider میاد اول count رو میگیره برای pagination، بعد رکوردها رو واکشی میکنه. اگر count صفر باشه دیگه رکوردها واکشی نمیشن، بنابراین کوئری بعدی به دیتابیس که میتونه هر جای برنامه باشه ناخواسته مقدارش از روی کش بر میگرده. من میخوام اگر count برابر 0 بود اون یک کوئری بعدی از کش استفاده نکنه.
    متوجه منظورم شدید؟

  4. #4

    نقل قول: Caching in CActiveDataProvicer

    خوب چرا COUNT(*) رو بعنوان پارامتر cache نمیگذارین. البته باز هم فکر میکنم نباید این کد مشکلی داشته باشه و update_time شما مقدار نداره. یک رکورد دستی درج کنید و update_time رو خالی بگذارین ببینید چی درج میشه و مقدار پیشفرض داره یا نه. اگه داشت که هیچ ولی اگه نداشت کد insert برنامه خودتون یا رفتارهای beforesave و... رو بررسی کنید ببینید update_time مقدار میگیره یا خیر.

  5. #5

    نقل قول: Caching in CActiveDataProvicer

    فکر میکنم منظور من رو متوجه نشدید. مشکل من با متد CActiveRecordCache هستش.

    public CActiveRecord cache(integer $duration, CCacheDependency|ICacheDependency $dependency=NULL, integer $queryCount=1)

    وقتی CACtiveDataProvider رو به این صورت به کار می بریم:

    CActiveDataProvider(Post::model()->cache($duration, $dependecy, 2) . . .
    . . .

    یعنی coueryCount رو برابر 2 قرار میدیم، یک کوئری کش برای گرفتن count جهت pagination و یک کوئری کش برای واکشی رکوردها. اگر count برابر 0 باشه. کوئری کش دوم اجرا نمیشه و دستوری بعدی مثل این:

    $posts = POST::model()->findAll()

    هم از کش استفاده میکنه. در حالی که ما نمیخوایم از کش استفاده بشه. منوجه شدید؟

    $queryCount integer number of SQL queries that need to be cached after calling this method. Defaults to 1, meaning that the next SQL query will be cached.
    البته فکر کنم این کد مشکل رو حل کنه: (بعد از CACtiveDataProvider)

    Yii::app()->db->cache()->queryCachingCount = 0
    آخرین ویرایش به وسیله Muhammad-Ali : یک شنبه 26 مرداد 1393 در 09:37 صبح

  6. #6

    نقل قول: Caching in CActiveDataProvicer

    خوب دلیل اینکه 2 گذاشتین چیه؟ همون 1 بگذارین باشه دیگه. Yii بطور خودکار کوئری بعدی رو کش میکنه و موقع واکشی کوئری بعدی، اگه همچنان dependency نقض نشده باشه، یکبار دیگه کش رو تمدید میکنه. شما فقط با همون پارامترهای duration و dependency کار کنید.

  7. #7

    نقل قول: Caching in CActiveDataProvicer

    دلیل گذاشتن 2:
    First param in CActiveDataProvider could be a string with model name or instance of class. So, you may use CActiveRecord::cache() for cache, but you need set third param to 2, because you should cache 2 queries: counting and get data. . . .
    البته فکر کنم راه حل پیدا شد: (بعد از CACtiveDataProvider)

    Yii::app()->db->cache()->queryCachingCount = 0

  8. #8

    نقل قول: Caching in CActiveDataProvicer

    میشه دقیقاً بگین چه کاری میخواین انجام بدین و طبق چه راهنمایی (لینک بدین) تا اینجا پیش رفتین؟ احساس میکنم یک جای کار رو دارین اشتباه انجام میدین.

  9. #9

    نقل قول: Caching in CActiveDataProvicer

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    میشه دقیقاً بگین چه کاری میخواین انجام بدین و طبق چه راهنمایی (لینک بدین) تا اینجا پیش رفتین؟ احساس میکنم یک جای کار رو دارین اشتباه انجام میدین.
    پست قبلی توضیح دادم. که فکر کنم راه رو پیدا شد.

  10. #10

    نقل قول: Caching in CActiveDataProvicer

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    خوب دلیل اینکه 2 گذاشتین چیه؟ همون 1 بگذارین باشه دیگه. Yii بطور خودکار کوئری بعدی رو کش میکنه و موقع واکشی کوئری بعدی، اگه همچنان dependency نقض نشده باشه، یکبار دیگه کش رو تمدید میکنه. شما فقط با همون پارامترهای duration و dependency کار کنید.
    مطمئنید؟ من امتحان کردم قبلا جواب نداده! ما میخوایم دو تا کوئری متفاوت کش بشن. یکی برای count یکی هم برای واکشی رکوردها

تاپیک های مشابه

  1. Cache-Server چیست ؟
    نوشته شده توسط Developer Programmer در بخش شبکه و Networking‌
    پاسخ: 1
    آخرین پست: شنبه 16 آذر 1392, 13:52 عصر
  2. HttpRuntime.Cache و HttpContext.Cache
    نوشته شده توسط MSYNK در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: چهارشنبه 29 مهر 1383, 12:20 عصر
  3. Squid cache manager
    نوشته شده توسط امیر زبل در بخش شبکه و Networking‌
    پاسخ: 1
    آخرین پست: جمعه 28 شهریور 1382, 20:00 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •