Google App Engine(java)服务类是否为线程安全?

时间:2011-02-26 16:25:46

标签: java google-app-engine

是否可以从工厂获取对服务的引用并将其用于处理多个请求?最好使用以下伪代码解释servlet:

SomeServlet...{
  MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();
  UserService userService = UserServiceFactory.getUserService();
  DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();

  doGet(...){
    userService.doSomething(...);
  }
...
}

这可能是一个不成熟的优化,但我很想知道为每个请求获取服务的成本是多少。请分享您的见解。

2 个答案:

答案 0 :(得分:7)

在Google群组帖子http://groups.google.com/group/google-appengine-java/browse_thread/thread/d3f1536084f59c22中,Ikai Lan(来自Google的GAE团队)说MemcacheService是线程安全的,但缓存它没有用,因为每次获得时只有一个对象分配来自工厂的服务。

由于所有服务都以类似的方式获得,我认为我们可以假设它们都遵循相同的设计并且都是线程安全的。但是,因为在每个查询中获取新实例并不昂贵,所以我不会缓存它们。

答案 1 :(得分:0)

在google群组线程中https://groups.google.com/forum/#!topic/google-appengine-java/4Zt5IEKy_5s John Patterson表示DatastoreService非常轻量级,因此最好从工厂获取一个并在您需要的位置进行配置。

同样在同一个帖子中,Jeff Schnitzer指出,由于DatastoreService未被标记为线程安全,因此将其分配(或将始终是)是不明智的。

但是,某些方法(如getCurrentTransaction())被记录为线程感知(https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/BaseDatastoreService),因此在某些情况下,DatastoreService可能是线程容错的。