Доступ к переменной на разных страницах cfm в Cold Fusion

#scope #coldfusion #coldfusion-2016

#область действия #coldfusion #coldfusion-2016

Вопрос:

У меня есть результирующий набор cfquery, к которому мне нужно получить доступ на разных страницах cfm моего кода. Сначала я попробовал присвоить ее переменной в клиентской области, сериализовав ее как объект json. Но CF не позволяет назначать сложные данные в клиентской области. Я попробовал присвоить ее переменной в области приложения, но проблема в том, что для одного пользователя иногда значение аналогично значению другого пользователя, который одновременно вошел в приложение. Может ли кто-нибудь помочь мне с альтернативой для достижения этой цели, поскольку переменная области видимости клиента и переменная области применения недоступны.

Комментарии:

1. Вы смотрели на область действия сеанса? helpx.adobe.com/coldfusion/developing-applications /… — если это действительно большой набор данных, просто запустите его на каждой странице

2. Не могли бы вы подробнее рассказать о том, что хранится и почему область применения не является опцией?

3. @SOS В моем приложении не все пользователи имеют доступ ко всему. Как и все студенты, они не будут выбирать одни и те же факультативы. Эти факультативные идентификаторы субъекта я получаю от http-вызова. Затем список идентификаторов объекта, который я получаю, используется в качестве параметра запроса в cfquery. Поэтому, когда я назначаю результирующий набор для application.subject , эта переменная должна содержать разные идентификаторы объектов и их сведения. Но когда в систему входит более одного пользователя, иногда они видят похожие идентификаторы и сведения о предметах, даже если факультативные темы не одинаковы для всех.

4. Есть ли конкретная причина, по которой вы не можете просто повторно выполнить запросы по мере необходимости? Все это обеспечивает экономичное кэширование. Если вы не столкнулись с конкретной проблемой, которая каким-то образом оправдывает хранение запросов, я бы, вероятно, просто перезапустил их по мере необходимости.

Ответ №1:

Вы должны быть очень осторожны при хранении данных запроса в любой области. В конечном итоге вы можете хранить все больший объем данных в этих областях, которые потребляют память на сервере. Без стратегии удаления этих данных из этих областей (в частности server , application и session ) вы можете негативно повлиять на производительность сервера с течением времени. По мере увеличения количества пользователей увеличивается объем кэшированных данных / памяти и снижается производительность приложения.

Чаще всего я бы предпочел просто повторно запускать запрос по мере необходимости на разных страницах. Создайте CFC с функцией, которая содержит ваш запрос. Передайте любые релевантные данные для запроса в качестве аргументов функции. Затем вы можете повторно использовать этот запрос на нескольких страницах.

Отличный обзор областей видимости переменных в приложениях CFML:

http://www.learncfinaweek.com/course/index/section/Decision_Making_and_Scopes/item/Scopes/

  • Приложение: переменные приложения являются общими для всех подключенных клиентов для текущего именованного приложения. Эта область также используется для объектов, созданных с использованием шаблона singleton. Эта область доступна для всех запросов в течение срока службы приложения, который может завершиться при завершении работы сервера, сбоях приложения или тайм-ауте приложения.
  • Сессия: разработчики используют переменные сеанса для хранения данных одного посетителя в запросах. Эта область доступна только для текущего сеанса и будет сохраняться до завершения работы сервера или приложения или до истечения времени ожидания сеанса.

Обзор компонентов для повторного использования кода: http://www.learncfinaweek.com/course/index/section/Code_Reuse/item/Components

Ответ №2:

Предполагая, что запрос не изменится, вы можете использовать атрибут cachedWithin cfquery.

 <cfquery name="getEmployees" datasource="cfdocexamples" cachedwithin="#CreateTimespan(0,0,60,0)#" >
    SELECT FIRSTNAME,LASTNAME,EMAIL,PHONE
    FROM EMPLOYEES
</cfquery>