我已經設置了一個查詢運行很多次的緩存..查詢本身並不是那麼慢,但它得到運行多次爲每個請求,所以計算緩存可能會有所幫助。我已啓用緩存,但似乎並沒有真正改變。如何判斷我的查詢是否被緩存?如何判斷coldfusion查詢是否緩存?
我設置緩存使用:q.setCachedWithin("#createTimespan(0, 1, 0, 0)#");
這裏是我完整的查詢水面浮油:
q = New Query();
q.setSQL("SELECT * FROM guest_booking WHERE room_id = :roomID and check_in <= :iDate and check_out > :iDate and status != 0");
q.setName("checkAvailability");
q.setCachedWithin("#createTimespan(0, 1, 0, 0)#");
q.addParam(name="iDate", value="#createODBCDate(arguments.date)#", cfsqltype="cf_sql_date");
q.addParam(name="roomID", value="#createODBCDate(arguments.room_id)#", cfsqltype="cf_sql_integer");
qResult = q.execute().getresult();
調試輸出顯示:
checkAvailability (Datasource=accom_crm, Time=16ms, Records=1) in C:\ColdFusion9\CustomTags\com\adobe\coldfusion\base.cfc @ 16:15:56.056
SELECT * FROM guest_booking WHERE room_id =
?
and check_in <=
?
and check_out >
?
and status != 0
Query Parameter Value(s) -
Parameter #1(cf_sql_integer) = 56
Parameter #2(cf_sql_date) = {ts '2011-11-14 00:00:00'}
Parameter #3(cf_sql_date) = {ts '2011-11-14 00:00:00'}
提前很多感謝..
Jason
EDIT AFTER Shawn的回答以下
有更改的查詢水面浮油的以下兩行: 查詢名稱現在是不同查詢不同..從傳遞PARAMATERS動態創建在
q.setName("check#arguments.room_id##DateFormat(arguments.date,'ddmmyy')#");
createTimeSpan除去來自引號,所以不會以字符串形式傳入。
q.setCachedWithin(createTimespan(0, 1, 0, 0));
我也試圖通過毫無準備的查詢發送(不使用addparam(),但只是使變量直接在查詢字符串),但並沒有區別..
EDIT 2肖恩的AFTER第三名EDITANWSER下面 肖恩..很好的皮卡編輯3!你已經隔離了問題所在。 (任何人讀這篇文章,快速,投了肖恩的答案,他發現在乾草堆中的針)
傳遞的日期作爲PARAMS不cache..eg。
q.setSQL("SELECT booking_id FROM guest_booking WHERE room_id = :roomID and check_in <= :iDate and check_out > :iDate and status != 0");
q.addParam(name="iDate", value="#createODBCDate(arguments.date)#", cfsqltype="cf_sql_date");
剛好路過它作爲一個變量不cache..eg。
q.setSQL("SELECT booking_id FROM guest_booking WHERE room_id = :roomID and check_in <= #createODBCDate(arguments.date)# and check_out > #createODBCDate(arguments.date)# and status != 0");
但硬編碼的日期DOES cache..eg。
q.setSQL("SELECT booking_id FROM guest_booking WHERE room_id = :roomID and check_in <= {ts '2011-12-16 00:00:00'} and check_out > {ts '2011-12-16 00:00:00'} and status != 0");
這一切都很好,但顯然我無法對日期進行硬編碼......顯然,日期每天都會發生變化,但即使在我運行相同查詢時也會動態傳遞相同日期(查詢語法正在完全相同),如果日期作爲變量傳遞,查詢將不會緩存。只有當它們被硬編碼到查詢中時.. wierd ..將繼續播放並查看我能找到的內容。
謝謝肖恩指出問題!
您是否驗證過在ColdFusion管理器中啓用了查詢緩存,並且緩存查詢的最大數量未設置爲零? –
嗨cfvonner,最大數量的緩存查詢設置爲100.我找不到可以啓用/禁用查詢緩存的位置。 – Jason
它們是一個,它們相同;將該值設置爲0將禁用查詢緩存。 –