2012-03-28 79 views
1

我有一個Java GAE應用程序,應該在我部署應用程序的新版本時清除memcache。我正在使用靜態初始化程序,即 static {MemcacheServiceFactory.getMemcacheService()。clearAll(); }GAE初始化建議練習

但是,無論何時啓動新實例,這都會清除memcache,這不是期望的行爲。

什麼是執行初始化代碼的正確方法?

TIA

+2

爲什麼不只是版本化您的memcache條目,並在版本不匹配的情況下放棄它們,而不是試圖以編程方式在每次部署時清除整個memcache內容?如果你在memcache鍵中包含了版本號,它會爲你有效地處理這個問題(因爲如果foo-1-blah在高速緩存中並且你試圖請求foo-2-blah,那將是一個未命中)。 – Amber 2012-03-28 21:38:36

+0

除非您在部署時自行運行,否則無法在每次部署時僅運行一次。琥珀的建議是一個很好的建議。 – 2012-03-29 09:12:18

回答

-4

一次的應用的初始化可以在Servlet的init()方法來進行。下面是一個例子

public class CatalogServlet extends HttpServlet { 
    private BookDB bookDB; 
    public void init() throws ServletException { 
     bookDB = (BookDB)getServletContext(). 
     getAttribute("bookDB"); 
} 

在上面的例子中,ServletContext屬性是,當然,只是小服務程序調用(以正常的方式保持狀態)之間存在的變量。這當然,假設你在其他地方將這個變量存儲在ServletContext中。另一種方法是在部署描述符中創建變量。

要部署描述符(web.xml)中設置初始化參數,這裏有一個例子:

<servlet 
    <servlet-name... 
    <servlet-class ... 
    <init-param> 
     <param-name>param1</param-name> 
     <param-value>value1</param-value> 
    </init-param> 
</servlet> 

如果這不回答這個問題,請澄清「每當一個新的實例啓動」。

+0

每次實例由App Engine啓動時,都會調用init方法,由於請求加載或不活動,該方法可能隨時發生。所以假設init方法在部署之後才被調用是不正確的,這是海報請求的。 – Brummo 2012-03-29 05:14:28

+0

他並沒有要求如何獲取初始化參數,而是詢問您如何在每次部署時只運行一次初始化代碼。鑑於GAE將會起飛並且無情地摧毀實例,可能會有數百個實例同時運行,這是一個很好的問題。 – Simon 2012-03-29 17:50:40

3

我使用工廠創建我的memcache密鑰,並且他們總是附加我的應用程序的版本號,所以當我上傳新版本時,密鑰是新的,我忘記了舊的緩存值,它們將消失擁有。

我也有一個servlet在web.xml中定義,只有admin的安全約束,然後在升級後手動瀏覽到它的URL(/ admin/example) - 以admin身份登錄。這個servlet讓我運行一次代碼來啓動任何升級存儲數據和清除緩存的任務。

<security-constraint> 
    <web-resource-collection> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
+0

更新:Google最近向管理控制檯添加了一個按鈕,用於清除應用上的memcache。所以每當我升級,現在我只是打那個按鈕。 – bsautner 2012-04-20 12:10:48