Java 应用程序引擎服务的适当范围

Java 应用程序引擎服务的适当范围,java,google-app-engine,design-patterns,scope,Java,Google App Engine,Design Patterns,Scope,创建servlet时,应用引擎服务的适当范围是什么:静态、实例还是本地?和每种方法的含义是什么?似乎您应该在尽可能广泛的范围内使用它们,以避免重新创建(或重新检索)它们的开销,但我想知道这是否会导致数据的不当重用,尤其是在true的情况下 下面提供了每个范围的示例。将在下面的示例中使用,但我的问题适用于任何和所有服务(尽管我不确定答案是否取决于所使用的服务)。我常用、、和 静态范围: public class MyServlet extends HttpServlet { privat

创建servlet时,应用引擎服务的适当范围是什么:静态、实例还是本地?和每种方法的含义是什么?似乎您应该在尽可能广泛的范围内使用它们,以避免重新创建(或重新检索)它们的开销,但我想知道这是否会导致数据的不当重用,尤其是在
true
的情况下


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

静态范围:

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");
    }
}
实例成员:

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");
    }
}
本地范围:

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

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

所以所有的
*服务
类基本上都是围绕序列化/反序列化代码的非常薄的包装。例如,见


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

完整、简洁的答案,有源代码支持。谢谢。是的,但是让它们成为能够在单元测试中模拟它们的字段仍然是有意义的。