创建servlet时App Engine服务的适当范围:静态,实例还是本地?并且每个的含义是什么?看起来你应该想要在尽可能宽的范围内使用它们,以避免重新创建(或重新检索)它们的开销,但我想知道这是否会导致数据的不正确重用,尤其是{ {1}}。
下面提供每个范围的示例。 MemcacheService
将在下面的示例中使用,但我的问题适用于任何和所有服务(虽然我不确定答案是否取决于所使用的服务)。我通常使用MemcacheService
,DatastoreService
,PersistenceManager
,ChannelService
和UserService
。
静态范围:
<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");
}
}
答案 0 :(得分:3)
GAE是一个分布式系统,其所有服务都在不同的服务器上运行。因此,当您调用服务时,它会在内部序列化请求(afaik with protocol buffers)将其发送到运行该服务的服务器,检索结果并对其进行反序列化。
因此,所有*Service
类基本上都是围绕序列化/反序列化代码的非常薄的包装器。请参阅示例source of MemcacheService。
关于范围:没有必要优化*Service
类,因为它们是非常薄的包装器,与整个服务往返相比,创建它们的时间应该可以忽略不计。