onRequestStart CFWheels

У меня проблемы с параллелизмом в cfwheels.

У меня есть некоторый код в events/onrequeststart.cfm, который выполняется каждый раз, когда пользователь запрашивает что-то.

Тестовый пример: Пользователь A - время запроса: 10 секунд Пользователь B - время запроса: 2 секунды

Если пользователь B отправляет запрос, когда пользователь A уже работает над запросом, настройки пользователя B перейдут к пользователю A, а пользователь A отобразит результаты на основе запроса пользователя B.

Я попытался использовать cflock в onrequeststart.cfm, но, похоже, он не работает. У меня нет большого опыта работы с cfwheels, поэтому я, возможно, пытаюсь сделать что-то, что логически неправильно.

Это часть кода, которая запутывается.

    <cfquery name="currentUser" datasource="#application.ds#">
        select * from clientadmin where clientAdminid ='#session.clientadminid#'
    </cfquery>

    <cfquery name="currentClient" datasource="#application.ds#">
        select * from clientBrands where clientbrandID ='#currentUser.ClientBrandID#'
    </cfquery>



<cfset application.clientAdminSurveys = application.generalFunctions.clientSurveys(clientAdminID=session.clientAdminID, clientBrandID = currentUser.clientBrandID)>
<cfset application.AssociatedDoctors = application.generalFunctions.AssociatedDoctors(clientAdminID=session.clientAdminID, clientBrandID = currentUser.clientBrandID)>

Итак, я думаю, мой вопрос, как избежать этого?

3 ответа

Решение

1) Область действия приложения - "широкое приложение" (все пользователи всего сайта) - вам не следует устанавливать там настройки для каждого пользователя, поскольку, как вы обнаружили, пользователь B перезаписывает пользователя A. Используйте область сеанса для пользовательские вещи. Итак, в последних двух строках вы устанавливаете содержимое области приложения, используя данные области сеанса!

2) В качестве примечания, в колесах вы можете использовать application.wheels.datasourcename для получения имени базы данных.

Я бы поместил этот код в функцию внутри контроллера (controller.cfc) и запустить его с помощью фильтра.

см.: http://cfwheels.org/docs/1-1/chapter/filters

Это работало для меня без проблем для подобных задач.

Также я бы бросил любую ссылку на application. потому что это, вероятно, где вещи перепутаны. Правильное место для размещения этих функций в events/functions.cfm

Конечно, это не видя больше вашего кода...

Как уже упоминал Neokoenig, вы используете общую область для хранения пользовательских данных, вы должны хранить их в SESSION. Если вам нужны данные в области приложения, вы должны использовать блокировку при настройке этих данных, но похоже, что вы должны запускать их в onSessionStart один раз, а не при каждом запросе. Если вам нужно запускать его при каждом запросе, вы можете продолжить использовать onRequestStart, но использовать хранилище сессий для конкретного пользователя, а не глобальный прикладной уровень.

Просто помните: переменные приложения будут отображать одинаковые данные для всех пользователей. Таким образом, если пользователь a устанавливает application.foo = 1, а пользователь b устанавливает application.foo = 2, то пользователь 1 пытается получить доступ к application.foo, пользователь 1 увидит значение 2 пользователя 2. Если бы при этом использовалась область действия сеанса, у вас не было бы этого та же проблема. Если пользователь 1 устанавливает SESSION.foo = 1, а пользователь 2 устанавливает SESSION.foo = 2. Когда пользователь обращается к переменной SESSION.foo, он будет содержать только данные, установленные этим пользователем (например, пользователь 1 выведет SESSION.foo и увидит значение, 1)

Другие вопросы по тегам