App Engine服务的适当范围

时间:2012-09-02 17:36:27

标签: java google-app-engine design-patterns scope

创建servlet时App Engine服务的适当范围:静态,实例还是本地?并且每个的含义是什么?看起来你应该想要在尽可能宽的范围内使用它们,以避免重新创建(或重新检索)它们的开销,但我想知道这是否会导致数据的不正确重用,尤其是{ {1}}。


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

静态范围:

<threadsafe>true</threadsafe>

实例成员:

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");
    }
}

1 个答案:

答案 0 :(得分:3)

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

因此,所有*Service类基本上都是围绕序列化/反序列化代码的非常薄的包装器。请参阅示例source of MemcacheService

关于范围:没有必要优化*Service类,因为它们是非常薄的包装器,与整个服务往返相比,创建它们的时间应该可以忽略不计。