2011-02-26 9 views
5

¿Está bien obtener una referencia de un servicio de fábrica una vez y usarla para manejar solicitudes múltiples? Puede ser mejor explicado usando pseudocódigo siguiente de un servlet:¿Las clases de servicio de Google App Engine (java) son Thread-Safe?

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

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

Puede ser una optimización prematura pero estoy curioso por saber cuál es el costo de la obtención de servicios para cada petición. Por favor comparte tu visión.

Respuesta

7

En el hilo de grupo de Google http://groups.google.com/group/google-appengine-java/browse_thread/thread/d3f1536084f59c22, Ikai Lan (del equipo de GAE en Google) dice que MemcacheService es seguro para subprocesos, pero que el almacenamiento en caché no es útil, porque solo hay una asignación de objeto cada vez que recibe el servicio la fábrica.

Dado que todos los servicios se obtienen de manera similar, creo que podemos suponer que todos siguen el mismo diseño y son todos seguros para subprocesos. Pero dado que no es costoso obtener una nueva instancia en cada consulta, no los almacenaría en caché.

0

En el subproceso de grupo de google https://groups.google.com/forum/#!topic/google-appengine-java/4Zt5IEKy_5s John Patterson indica que el DatastoreService es muy liviano, por lo que sería mejor obtener uno de fábrica y configurarlo en el punto que lo necesite.

También en el mismo hilo Jeff Schnitzer indica que dado que DatastoreService no está marcado como threadsafe, sería imprudente suponer que es (o siempre será).

Sin embargo, algunos métodos como getCurrentTransaction() están documentados como thread aware (https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/BaseDatastoreService), por lo que es posible que el DatastoreService sea thread-tolerant en algunas situaciones.

Cuestiones relacionadas