많은 시간 동안 실행되는 쿼리에서 캐싱을 설정했습니다. 쿼리 자체가 느린 것은 아니지만 각 요청마다 여러 번 실행되므로 계산 된 캐싱이 도움이 될 수 있습니다. 나는 캐싱을 가능하게했지만 실제로는 차이를 내지 않는 것처럼 보입니다. 내 쿼리가 캐싱되고 있는지 여부를 어떻게 알 수 있습니까? q.setCachedWithin("#createTimespan(0, 1, 0, 0)#");
여기Coldfusion 쿼리가 캐싱 중인지 어떻게 알 수 있습니까?
내 전체 쿼리는 Preperation됩니다 :
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
편집
아래 숀의 대답이 쿼리는 Preperation 다음 두 줄의 변경 후 :
q.setName("check#arguments.room_id##DateFormat(arguments.date,'ddmmyy')#");
createTimeSpan에 쿼리 이름은 쿼리를 다른 이제 다른 .. 통과 PARAMATERS에서 동적으로 생성을 제거 따옴표로 묶어 문자열로 전달하지 않습니다.
q.setCachedWithin(createTimespan(0, 1, 0, 0));
는 또한 (addparam()를 사용하지만, 단지 바로 쿼리 문자열의 변수 렌더링되지 않음) 준비가 쿼리를 전송했지만, 숀 후에 차이 ..
2 편집을하지 않은 3rd EDITANWSER BELOW Shawn .. 편집에 좋은 픽업 3 !!! 문제가있는 곳을 격리했습니다. cache..eg하지 않는 PARAMS로 날짜를 전달
(이 글을 읽는 사람이, 빠른, 최대 숀의 답변을 투표, 그는 건초 더미에서 바늘을 발견).
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");
하지만 하드 날짜를 않습니다 코딩 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 .. 계속 재생하고 찾을 수있는 부분을 봅니다.
문제를 정확히 지적 해 주셔서 감사합니다.
checkAvailability (Datasource=accom_crm, Time=0ms, Records=1, Cached Query)
뭔가가 캐시되는 쿼리를 방지한다 : 올바르게 캐시 된 경우
ColdFusion Administrator에서 쿼리 캐시가 활성화되어 있고 캐시 된 쿼리의 최대 수가 0으로 설정되지 않았는지 확인 했습니까? –
안녕하세요 cfvonner, 캐시 된 쿼리의 최대 수는 100으로 설정됩니다. 쿼리 캐시를 활성화/비활성화 할 수있는 위치를 찾을 수 없습니다. – Jason
이들은 하나이며 동일합니다. 값을 0으로 설정하면 쿼리 캐싱이 비활성화됩니다. –