2011-02-26 67 views
5

是否可以從工廠獲取對服務的引用並將其用於處理多個請求?它可以很好地解釋使用下面的僞代碼爲一個servlet:Google App Engine(java)服務類是線程安全的嗎?

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

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

它可能是一個不成熟的優化,但我只是想知道什麼是每個請求獲得服務的成本。請分享你的見解。

回答

7

在谷歌羣組線程http://groups.google.com/group/google-appengine-java/browse_thread/thread/d3f1536084f59c22中,Ikai Lan(來自Google的GAE團隊)表示MemcacheService是線程安全的,但緩存它並不有用,因爲每次從服務器獲得服務時都只有一個對象分配工廠。

由於所有的服務都以類似的方式獲得,我認爲我們可以假設它們都遵循相同的設計並且都是線程安全的。但是由於在每個查詢中獲取新實例並不昂貴,我不會緩存它們。

0

在谷歌組線程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可能是線程容忍的。

相關問題