我有一個Java GAE應用程序,應該在我部署應用程序的新版本時清除memcache。我正在使用靜態初始化程序,即 static {MemcacheServiceFactory.getMemcacheService()。clearAll(); }GAE初始化建議練習
但是,無論何時啓動新實例,這都會清除memcache,這不是期望的行爲。
什麼是執行初始化代碼的正確方法?
TIA
我有一個Java GAE應用程序,應該在我部署應用程序的新版本時清除memcache。我正在使用靜態初始化程序,即 static {MemcacheServiceFactory.getMemcacheService()。clearAll(); }GAE初始化建議練習
但是,無論何時啓動新實例,這都會清除memcache,這不是期望的行爲。
什麼是執行初始化代碼的正確方法?
TIA
一次的應用的初始化可以在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>
如果這不回答這個問題,請澄清「每當一個新的實例啓動」。
我使用工廠創建我的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>
更新:Google最近向管理控制檯添加了一個按鈕,用於清除應用上的memcache。所以每當我升級,現在我只是打那個按鈕。 – bsautner 2012-04-20 12:10:48
爲什麼不只是版本化您的memcache條目,並在版本不匹配的情況下放棄它們,而不是試圖以編程方式在每次部署時清除整個memcache內容?如果你在memcache鍵中包含了版本號,它會爲你有效地處理這個問題(因爲如果foo-1-blah在高速緩存中並且你試圖請求foo-2-blah,那將是一個未命中)。 – Amber 2012-03-28 21:38:36
除非您在部署時自行運行,否則無法在每次部署時僅運行一次。琥珀的建議是一個很好的建議。 – 2012-03-29 09:12:18