2012-10-17 51 views
2

在App Engine中使用com.google.appengine.api.memcache.MemcacheService進行緩存,我使用工廠創建了memcacheservice實例,並使用spring將其注入到類中一個單身。Google App Engine GAE MemcacheService Spring的單點注入

我在問這是否正確和最佳,以及是否有人對使用lazy-init選項或s​​ynchronized()的正面或負面影響進行了輸入。我想回答這個問題的結果是以這種方式使用memcacheservice的最佳方式。

謝謝!

廠:

public class CacheFactory { 

    private static MemcacheService INSTANCE; 

    private CacheFactory() { 
    } 

    public static MemcacheService getInstance() { 
     if (INSTANCE == null) { 
      synchronized(CacheFactory.class){ 
      INSTANCE = MemcacheServiceFactory.getMemcacheService(); 
      } 
     } 
     return INSTANCE; 

    } 



} 

的Spring bean:

<bean id="cacheFactory" class="com.nimbits.server.transactions.memcache.CacheFactory" 
      factory-method="getInstance" lazy-init="false" scope="singleton" > 
    </bean> 

示例用法:

<bean id="someService" class="SomeServiceImpl"> 
     <property name="cacheFactory" ref="cacheFactory" /> 
    </bean> 
+0

我想添加一條評論,說明這段代碼完美工作,表現非常好。我想確保它被優化以處理應用程序引擎環境的極高負載。 – bsautner

回答

1

該解決方案將工作,但它是有問題的:

  1. 你應該清楚地知道它不是一個完整的單例,因爲每個實例都有自己的工廠實例。

  2. 它會影響動態實例的啓動時間。有一個已知的問題,每個春天的bean會增加一些時間到實例啓動時間。如果您的HTTP請求會導致實例啓動,那麼請求啓動和實際響應過程之間會有延遲。過去幾年中有很多人面臨這個問題;個月。實例開始時間可能超過60秒,並且您將得到嚴格的截止日期異常。所以建議不要使用Spring來加速開始時間。詳情請查詢http://code.google.com/p/googleappengine/issues/detail?id=7706

+0

謝謝 - 我希望答案是在案例中使用spring的正確方法,但「不要使用spring for this」對我來說可以。 – bsautner