2011-12-08 2 views
2

사이트에 대한 모든 번역을 반환하는 쿼리가 있습니다. 사용자가 원하는 언어의 모든 번역을 가져온 다음 나머지를 사이트 기본 언어로 가져온 다음 변환하지 않은 다른 모든 문자열을 가져옵니다. 데이터가 자주 변경되지 않기 때문에 해당 쿼리에 대해 cachedwithin을 사용하고 있습니다. 번역이 수정되면 해당 쿼리 캐시가 재설정됩니다. 그런 다음 ColdFusion의 쿼리 쿼리를 사용하여 개별 레코드를 가져옵니다. 이로 인해 성능이 크게 향상되었습니다.쿼리의 ColdFusion 쿼리를 캐시 할 수 있습니까?

더 많은 성능 향상을 위해 쿼리 쿼리 쿼리를 추가 캐시 할 수 있는지 궁금합니다. 페이지로드가 1/6로 빨라지는 것처럼 보이지만이 기술에는 문제가 있습니까?

검색어 검색어는 아래와 같습니다.

<cfquery name="qryTranslation" dbtype="query"> 
    SELECT 
     TranslationString 
    FROM 
     qryGetText 
    WHERE 
     TranslationHash = <cfqueryparam value="#StringHash#" cfsqltype="cf_sql_varchar"> 
     AND DesiredLanguageID = <cfqueryparam value="#Arguments.LanguageID#" cfsqltype="cf_sql_bigint"> 
</cfquery> 

답변

1

쿼리 쿼리를 캐싱하는 데 큰 어려움이 있습니다.

캐시 된 데이터를 사용하려면 현재 쿼리가 동일한 SQL 문, 데이터 소스, 질의 이름, 사용자 이름 및 암호를 사용해야합니다

쿼리 캐싱에 대한 문서

는 것을 말한다.

그러나 쿼리 쿼리에는 데이터 원본, 사용자 이름 또는 암호가 없으므로 "캐시 오버"보호 기능이 많이 손실됩니다. 귀하의 질의에 포함 된 질의는 귀하의 서버에서 동일한 이름과 형식을 갖는 다른 질의와 충돌 할 것입니다. 따라서이 코드를 사용하는 웹 사이트가 두 개 이상일 경우로드 된 첫 번째 웹 사이트는 나머지 웹 사이트에서 사용되는 번역을 지정합니다.

이 문제를 신속하게 해결하려면 쿼리를 속임수로 설정하는 것이 좋습니다.

<cfquery name="qryTranslation" dbtype="query"> 
    SELECT 
     TranslationString 
    FROM 
     qryGetText 
    WHERE 
     TranslationHash = <cfqueryparam value="#StringHash#" cfsqltype="cf_sql_varchar"> 
     AND DesiredLanguageID = <cfqueryparam value="#Arguments.LanguageID#" cfsqltype="cf_sql_bigint"> 
     AND '#Variables.DSN#' = '#Variables.DSN#' 
</cfquery> 

변경 Variables.DSN는 메인 쿼리의 데이터 소스 속성의 값이 될 수 있습니다. 해당 변수를 신뢰하지 않으면 연산자의 양쪽에서 cfqueryparam으로 만듭니다.

1

은 가능한

네, 가능 쿼리

의 ColdFusion에서 쿼리를 캐시하는 것입니다.

그러나이 기술에는 문제가 있습니까?

당신 쿼리는 귀하의 케이스 StringHashArguments.LanguageID에, 그래서 그것의 서명을 기반으로 캐시됩니다. 페이지의 모든 번역에 대해 캐시 된 QofQ가있는 경우 사이트의 많은 페이지에서 "최대 캐시 쿼리 수"값을 최대한 활용할 수 있습니다. 이러한 일이 발생하면 쿼리 캐시에 잠재적으로 더 크고 중요한 캐시 된 쿼리가 제거 될 수 있습니다.

"최대 캐시 조회 수"계산은로드 테스트 및 캐시의 조회 수를 모니터하기 위해 서버 모니터에서 빌드를 사용하여 판별 할 수 있습니다.