2

我有查询返回站点的所有翻译。它通过获取用户所需语言的所有翻译,然后是站点默认语言的其余翻译,然后是任何其他尚未翻译的字符串来做到这一点。我在该查询上使用了 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>
4

2 回答 2

1

是否可以缓存一个 ColdFusion Query of Query

是的,有可能。

但是这种技术有什么问题吗?

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

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

于 2011-12-08T12:57:17.030 回答
1

缓存查询有一个很大的问题。

缓存查询的文档指出:

要使用缓存数据,当前查询必须使用相同的 SQL 语句、数据源、查询名称、用户名和密码。

然而,一个 Query of Query 没有数据源、用户名或密码,因此您失去了很多“过度缓存”保护。您问题中的查询将与您服务器上具有相同名称和格式的任何其他查询冲突。因此,如果您有多个网站使用此代码,则加载的第一个网站将决定其余网站使用的翻译。

解决此问题的一种快速方法是诱使查询受到更多约束。

<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。

于 2011-12-08T23:21:08.003 回答