3

我正在浏览Vosao CMS的代码,这是一个托管在 Google App Engine 上的开源 CMS(我认为这是一个很棒的想法),我偶然发现了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 习语吗?如果不是,那么在请求期间存储此类 UserEntity 的最佳 GAE 习语是什么?不应该像在 Spring Security 中那样使用 ThreadLocal 吗?还是某种范围的 bean(由依赖注入容器管理)?

4

2 回答 2

4

目前,App Engine 上的 Java 和 Python 运行时都是单线程的;你是对的,这意味着每个 JVM 只会执行一个 HTTP 请求,但是会同时启动多个 JVM 来处理多个传入请求。

然而,这在未来的任何时候都可能发生变化——Java Servlet 规范允许多线程。因此,您绝对应该使用 ThreadLocal。

于 2010-10-27T10:16:29.167 回答
4

GAE真的是“单线程”吗?使用 GAE 时将请求范围的数据存储在静态字段中是否安全?

它曾经是这种方式(直到 1.4.3),它仍然是默认的。

现在,您可以指定您的应用程序是线程安全的,然后您将接收到同一个 JVM/servlet 的并发请求。

这是否意味着,对于每个 JVM 实例,一次只会执行一个 HTTP 请求,而所有其他请求都在等待?

对于其他请求,您可能会获得另一个 JVM。但这不在你的控制范围内。他们也可以等待。

于 2011-03-31T04:13:01.790 回答