1

创建 servlet 时 App Engine 服务的正确范围是什么:静态、实例或本地?每个的含义是什么?似乎您应该希望在尽可能广泛的范围内使用它们,以避免重新创建(或重新检索)它们的开销,但我想知道这是否会导致数据的不当重用,尤其是如果<threadsafe>true</threadsafe>.


下面提供了每个范围的示例。 MemcacheService将在下面的示例中使用,但我的问题适用于任何和所有服务(尽管我不确定答案是否取决于所使用的服务)。我通常使用MemcacheService, DatastoreService, PersistenceManager,ChannelServiceUserService

静态范围:

public class MyServlet extends HttpServlet {
    private static MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        memcacheService.get("x");
    }
}

实例成员:

public class MyServlet extends HttpServlet {
    private MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        memcacheService.get("x");
    }
}

本地范围:

public class MyServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();
        memcacheService.get("x");
    }
}
4

1 回答 1

3

GAE 是一个分布式系统,它的所有服务都运行在不同的服务器上。因此,当您调用服务时,它会在内部序列化请求(使用协议缓冲区的 afaik)将其发送到运行服务的服务器,检索结果并反序列化它。

所以所有的*Service类基本上都是围绕序列化/反序列化代码的非常薄的包装器。例如,参见MemcacheService 的来源

关于范围:不需要对*Service类进行优化,因为它们是非常薄的包装器,与整个服务往返相比,创建它们所花费的时间可以忽略不计。

于 2012-09-02T18:23:04.503 回答