2

サイトのすべての翻訳を返すクエリがあります。これは、ユーザーが希望する言語のすべての翻訳を取得し、次にサイトの既定の言語の残りを取得し、次に翻訳されていないその他の文字列を取得することによって行われます。データは頻繁に変更されないため、そのクエリで cachedwithin を使用しています。翻訳が変更された場合は、そのクエリのキャッシュをリセットしています。次に、ColdFusion の Query of Query を使用して、目的の個々のレコードを取得します。これにより、パフォーマンスが大幅に向上しました。

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

クエリのクエリをキャッシュする際に 1 つの大きな落とし穴があります。

クエリのキャッシュに関するドキュメントには、次のように記載されています。

キャッシュされたデータを使用するには、現在のクエリで同じ SQL ステートメント、データ ソース、クエリ名、ユーザー名、およびパスワードを使用する必要があります。

ただし、Query of Query にはデータ ソース、ユーザー名、またはパスワードがないため、多くの「オーバー キャッシュ」保護が失われます。質問にあるクエリは、サーバー上の同じ名前とフォーマットを持つ他のクエリと競合します。したがって、このコードを使用する Web サイトが複数ある場合は、最初に読み込まれた Web サイトによって、残りの Web サイトで使用される翻訳が決定されます。

これを回避する簡単な方法は、クエリをだましてより制約を加えることです。

<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メイン クエリの datasource 属性の値に変更します。その変数が信頼できない場合は、オペレーターの両側で cfqueryparam にもします。

于 2011-12-08T23:21:08.003 に答える