2011-12-08 102 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語句,數據源,查詢名稱,用戶名和密碼。

但是查詢查詢沒有數據源,用戶名或密碼,所以你失去了很多「over-over」保護。查詢在您的問題中的地位與您的服務器上具有相同名稱和格式的任何其他查詢相沖突。因此,如果您有多個使用此代碼的網站,那麼加載的第一個網站將決定其他網站上使用的翻譯。

解決此問題的一個快速方法是欺騙查詢受到更多限制。

<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,那麼您可能會在網站上的許多頁面上使用緩存查詢的「最大數量」值。如果發生這種情況,可能更大,更重要的是,查詢緩存中的緩存查詢可能會被逐出。

可以通過加載測試和使用服務器監視器中的內部版本來監視高速緩存中的查詢數量來確定合適的「最大緩存查詢數」。