Потоково ли безопасно хранить данные внутри статического поля при развертывании в Google App Engine? - PullRequest
3 голосов
/ 27 октября 2010

Я просматривал код Vosao CMS , CMS с открытым исходным кодом, размещенной на Google App Engine (что я считаю отличной идеей), и наткнулся на следующий код внутри CurrentUser класс:

/**
 * Current user session value cache class. Due to GAE single-threaded nature
 * we can cache currently logged in user in static property. Which we set in 
 * authentication filter.
 */
public class CurrentUser {

        private static UserEntity user;

        public static UserEntity getInstance2() {
                return user;
        }

        public static void setInstance2(UserEntity aUser) {
                user = aUser;
        }
}

Я никогда не использовал GAE, но это звучит очень странно для меня.

  • Является ли GAE «однопоточным»? Безопасно ли хранить данные в области запроса внутри статического поля при использовании GAE?

  • Означает ли это, что для каждого экземпляра JVM одновременно будет выполняться только один HTTP-запрос, в то время как все другие запросы ожидают?

  • Это распространенная идиома GAE? Если нет, то как лучше всего использовать GAE для хранения такого UserEntity на время запроса? Не следует ли здесь использовать ThreadLocal, как это делают в Spring Security? Или какой-то bean-объект scoped (управляемый контейнером Dependency Injection)?

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

Является ли GAE «однопоточным»?Безопасно ли хранить данные в области запроса внутри статического поля при использовании GAE?

Раньше так было (до 1.4.3), и по-прежнему это по умолчанию.

Теперь, вы можете указать, что ваше приложение является поточно-безопасным , а затем вы будете получать параллельные запросы к одной и той же JVM / сервлету.

Это означает, что для каждого экземпляра JVM, только один HTTP-запрос будет выполняться одновременно, в то время как все другие запросы ожидают?

Для другого запроса вы, вероятно, получите другую JVM.Но это вне вашего контроля.Они также могут просто подождать.

4 голосов
/ 27 октября 2010

В настоящее время среды выполнения Java и Python в App Engine являются однопоточными;Вы правы, что это означает, что только один HTTP-запрос будет выполняться для каждой JVM, но несколько JVM будут запущены одновременно для обработки нескольких входящих запросов.

Однако это может измениться в любое время в будущем - JavaСпецификация сервлета допускает многопоточность.В результате вы должны обязательно использовать ThreadLocal.

...