2

私がやっていることはうまくいっているので、意見や別のアイデアを探していますが、それが最適かどうか尋ねたかったのです

インデックス ハンドラーが呼び出されると、リクエスト コレクションにデータベース テーブルからの特定のクエリを入力して、ユーザーが選択できるドロップダウンを作成できるサイトがあります。

2 つのモデルにクエリを実行し、その結果をそれぞれの変数に入れ、ビューでそれらをループしてドロップダウンを作成しています

インデックスハンドラ

function index(event, rc, prc){
    event.paramValue("debug",0);
    rc.stages  = getmodel("tms_proposal_stage").select();
    rc.plannedGiftTypes  = getmodel("tms_funding_type").select();
    event.setLayout('layout.bootstrap');
}

インデックス ビュー

  <div class="form-group">
    <label for="proposal_stage" class="control-label">Proposal Stage Code</label>
    <select id="proposal_stage" name="proposal_stage" class="form-control">
    <cfloop query="rc.stages">
        <option value="#stage_code#">#short_desc#</option>
    </cfloop>

    </select>
  </div>

2 つのクエリがそれほどコストがかからないことは理解していますが、これらを 100 回実行する必要がある場合、スケーラビリティの問題が発生します。これらのクエリ結果セットはあまり変化しないので、これらをキャッシュまたは保存し、別の方法でアクセスするべきではないかと考えていました。

私が使用したhtml5ローカルストレージについて考えましたが、これに関してはそうではありません。また、これらすべてのデータベース呼び出しを行い、キャッシュされてから他の関数​​によって参照される新しいハンドラー関数を作成することも検討しました

とにかく、すべての考えは高く評価されます

4

1 に答える 1

3

いくつかのオプションを利用できます。ColdBox を使用しているため、CacheBox をすぐに利用できます。 https://github.com/ColdBox/cbox-refcards/raw/master/CacheBox/CacheBox-Refcard.pdf

データのインライン キャッシュを行う非常に簡単な方法は、コンポーネントの上部に CacheBox プロバイダーを挿入することです。

component {
  property name="cache" inject="cachebox:default";
}

次に、イベントでキャッシュ API を使用してデータを保存および取得します。私のお気に入りのメソッドは getOrSet() です。1 回の呼び出しで処理できるからです。

rc.stages = cache.getOrSet(
  objectKey="stages",
  produce=function(){ 
    return getmodel("tms_proposal_stage").select();
  }
);

クロージャーは、キーがまだキャッシュにない場合にのみ実行されます。 http://wiki.coldbox.org/wiki/WhatsNew:CacheBox-1.6.cfm#Get_Or_Set_Baby

もう 1 つの方法は、完全な HTML をキャッシュすることです。これを行うには、フォーム コントロールの HTML のみを出力するビューレットを作成します。次のように、そのビューだけの出力を返すイベントを作成します。

function stagesFormInput(event, rc, prc) cache=true {
  var stagesData = getmodel("tms_proposal_stage").select();
  return renderView(view="viewlets/stages", args={ stagesData : stagesData } );
}

rc または prc を汚染しないように、stageData をビューに直接渡していることに注意してください。このデータは、ビューレットで「args.stagesData」として利用できます。

メソッド宣言の「 cache=true 」にも注意してください。これが ColdBox にこのイベントをキャッシュするように指示する魔法です (CacheBox の「テンプレート」プロバイダー内)。タイムアウトを指定できますが、これはデフォルトを使用します。これで、/config/ColdBox.cfc ファイルで eventCaching が有効になりまし

coldbox={
    eventCaching = true
}

http://wiki.coldbox.org/wiki/ConfigurationCFC.cfm#Application_Aspects

最後に、メイン ビューまたはレイアウトで、キャッシュされた HTML を出力したいすべての場所で新しいビューレットを実行します。

#runEvent("viewlets.stagesFormInput")#

これはもう少しセットアップが必要ですが、完全な HTML スニペットをキャッシュするため、より強力であり、これは本当に理想的です。また、動作中のアプリ内でこれをデモするサンプル アプリ全体もあります。ここで確認できます: https://github.com/bdw429s/ColdBox-Viewlet-Sample

于 2015-04-10T19:02:54.013 に答える