是否可以从工厂获取对服务的引用并将其用于处理多个请求?最好使用以下伪代码解释servlet:
SomeServlet...{
MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();
UserService userService = UserServiceFactory.getUserService();
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
doGet(...){
userService.doSomething(...);
}
...
}
这可能是一个不成熟的优化,但我很想知道为每个请求获取服务的成本是多少。请分享您的见解。
答案 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可能是线程容错的。