是否可以缓存查询的ColdFusion查询

时间:2011-12-08 12:20:07

标签: coldfusion coldfusion-9 qoq

我有查询返回网站的所有翻译。它通过获取用户所需语言的所有翻译,然后是网站默认语言中的其余翻译,然后是尚未翻译的任何其他字符串来实现此目的。我在该查询上使用cachedwithin,因为数据不经常更改,并且如果修改了翻译,我将重置该查询缓存。然后我使用ColdFusion的查询查询来获取我所追求的个人记录。这大大提高了性能。

我想知道是否可以进一步缓存Query of Query查询以进一步提高性能。它似乎可以工作,因为页面加载速度提高了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>

2 个答案:

答案 0 :(得分:1)

  

是否可以缓存查询的ColdFusion查询

是的,这是可能的。

  然而,这种技术有什么问题吗?

您的查询将根据其签名进行缓存,因此在您的情况下,StringHashArguments.LanguageID。如果您在网站上的许多页面上为每个翻译都有缓存的QofQ,那么您可能会最大化“最大缓存查询数”值。如果发生这种情况,则可能会逐出查询缓存中的其他可能更大且更重要的缓存查询。

计算合适的“最大缓存查询数”可以通过负载测试和使用内置服务器监视器来监视缓存中的查询数量。

答案 1 :(得分: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。