我有一个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