Coldfusion Coldbox - создание и кеширование раскрывающихся опций из запросов

Я ищу мнения и альтернативные идеи, так как то, что я делаю, работает, но хотел спросить, было ли это оптимальным

У меня есть сайт, который при вызове обработчика индекса заполняет коллекцию запросов конкретными запросами из таблиц базы данных, чтобы я мог создавать раскрывающиеся списки для выбора пользователем.

Я запрашиваю две модели и помещаю их результаты в соответствующие переменные, а затем просматриваю их в представлении, чтобы создать раскрывающийся список

обработчик индекса

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, которое я использовал, но не в этом отношении. Я также подумал о создании новой функции-обработчика, которая выполняет все эти вызовы базы данных и кэшируется, а затем на нее ссылаются другие функции.

в любом случае, все мысли ценятся


person Jay Rizzi    schedule 10.04.2015    source источник
comment
Отдельная функция для вызовов базы данных имеет смысл. Кеширования нет. Результат запроса, который не сильно меняется, по-прежнему изменяется, и кеширование предотвращает доступность этих изменений.   -  person Dan Bracuk    schedule 10.04.2015


Ответы (1)


Вам доступны несколько вариантов. Поскольку вы используете 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 для элемента управления формы. Создайте событие, которое возвращает результат только этого представления следующим образом:

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. Эти данные будут доступны в вашем вьюлете как «args.stagesData».

Также обратите внимание на «cache = true» в объявлении метода. Это волшебство, которое сообщит ColdBox о необходимости кэширования этого события (внутри «поставщика шаблонов» CacheBox). Вы можете указать тайм-аут, но он будет использовать значение по умолчанию. Теперь включено кэширование событий в вашем /config/ColdBox.cfc < / strong> файл.

coldbox={
    eventCaching = true
}

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

И, наконец, в главном представлении или макете просто запустите новый вьюлет везде, где вы хотите, чтобы кешированный HTML выводился.

#runEvent("viewlets.stagesFormInput")#

Это немного более сложная настройка, но она более эффективна, поскольку кэширует полный фрагмент HTML, что действительно идеально. У меня также есть целый образец приложения, которое демонстрирует это в рабочем приложении. Вы можете проверить это здесь: https://github.com/bdw429s/ColdBox-Viewlet-Sample < / а>

person Brad Wood    schedule 10.04.2015