2012-09-02 60 views
1

創建Servlet時適用於App Engine服務的適當範圍:static,instance或local?和每個有什麼含義?看起來您應該儘可能在範圍內使用它們,以避免重新創建(或重新獲取)它們的開銷,但是我想知道這是否會導致數據的不正確重用,特別是如果<threadsafe>true</threadsafe>適用於App Engine服務的範圍


下面提供了每個範圍的示例。 MemcacheService將在以下示例中使用,但我的問題適用於任何和所有服務(儘管我不確定答案取決於所使用的服務)。我通常使用MemcacheService,DatastoreService,PersistenceManager,ChannelServiceUserService

靜態範圍:

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"); 
    } 
} 

本地範圍:

public class MyServlet extends HttpServlet { 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) { 
     MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService(); 
     memcacheService.get("x"); 
    } 
} 

回答

3

GAE是DISTRI其中所有服務都在不同的服務器上運行。所以當你調用一個服務時,它會在內部序列化請求(帶有協議緩衝區的afaik)將它發送到運行服務的服務器,檢索結果並反序列化它。

因此,所有*Service類基本上都是非常簡單的包裝在序列化/反序列化代碼周圍。例如參見source of MemcacheService

關於範圍:沒有必要優化*Service類,因爲它們是非常薄的包裝,並且與整個服務往返相比,創建它們的時間應該可以忽略不計。

+0

完整,簡潔的答案,有源代碼備份。謝謝。 –

+1

沒錯,但讓他們的領域能夠在單元測試中嘲笑他們仍然是有道理的。 –

相關問題