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>

我知道两个查询的成本并不高,但是如果我需要运行其中的 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(),因为它将它包装在一个调用中。

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

另一种方法是缓存完整的 HTML。为此,请创建一个仅输出表单控件的 HTML 的 viewlet。创建一个事件,该事件仅返回该视图的输出,如下所示:

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

请注意,我将 stageData 直接传递到视图中,因此它不会污染 rc 或 prc。此数据将在您的 viewlet 中以“ args.stagesData ”的形式提供。

还要注意方法声明中的“ cache=true ”。这就是告诉 ColdBox 缓存此事件的魔力(在 CacheBox 的“模板”提供程序中)。您可以指定超时,但这将使用默认值。现在,在/config/ColdBox.cfc文件中启用事件缓存。

coldbox={
    eventCaching = true
}

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

最后,在您的主视图或布局中,只需在您希望输出缓存的 HTML 的任何地方运行新的 viewlet。

#runEvent("viewlets.stagesFormInput")#

这是一个多一点的设置,但更强大,因为它缓存了完整的 HTML 片段,这是非常理想的。我还有一个完整的示例应用程序,可以在一个工作应用程序中进行演示。你可以在这里查看: https ://github.com/bdw429s/ColdBox-Viewlet-Sample

于 2015-04-10T19:02:54.013 回答