我读到的关于AppEngine数据库(对于Java)的一个更常见的抱怨是它在“冷启动时间”时非常慢。这是什么意思?这是我应该担心的事情吗?
答案 0 :(得分:10)
这是你应该担心的事情。
当您的应用在某段时间内没有任何请求时,Google App Engine会启动新的JVM来处理请求。从“冷”处理数据存储 - 即在JVM中第一次 - 可能需要相当长的时间,多达5秒钟。
在数据存储区(通常是PersistenceManager
的实例)上有句柄之后,一切都很好(对于JVM的生命周期!)。
编辑:
在GAE-Java中创建一个新的JVM也很慢。阅读http://code.google.com/appengine/docs/java/datastore/overview.html,你会发现他们使用Singleton类来获得PersistenceManagerFactory
的可用性,因为它们描述了将一个实例化为“昂贵”的操作。
你可以自己测试一下。在GAE-Java上创建一个仅返回“Hello World!”的全新应用程序。你会发现对应用程序的第一个请求需要几秒钟。
添加PersistenceManagerFactory
的请求,您会发现第一个请求需要几秒钟。
编辑编辑:
我现在已经为您的观看乐趣创建了这个测试:
http://stackoverflowanswers.appspot.com/helloworld
您将立即看到“Hello,world 0”或“Hello,world xxxx”,其中xxxx是MS中获取数据存储区处理所需时间的计数。我认为数据存储区中索引的复杂性和数量可能会对获取数据存储区处理所需的时间产生影响,因为这个应用程序比我的其他一些应用程序更快。
PMF是应用引擎文档中提供的副本的精确副本。
@SuppressWarnings("serial")
public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
long a = System.currentTimeMillis();
PersistenceManager p = PMF.get().getPersistenceManager();
long b = System.currentTimeMillis() - a;
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world "+b);
}
}
编辑编辑编辑:
我更改了我的代码,以便它为每个请求实例化PersistenceManagerFactory
,现在它会抛出500个服务器错误,并在日志中:
javax.jdo.JDOFatalUserException: 应用程序代码试图创建一个 PersistenceManagerFactory命名 Transactions-可选,但有一个 这个名字已经存在!实例 PersistenceManagerFactory是 创建速度极慢,而且确实如此 通常没有必要创建一个 具有给定名称不止一次。 相反,创建一个单身人士并分享 它贯穿你的代码。如果你 确实需要创建一个副本 PersistenceManagerFactory(例如for 单位测试套件),设置 appengine.orm.disable.duplicate.pmf.exception 系统属性以避免此错误。
我认为我不需要再提供在应用引擎中获取数据存储区句柄的证据了。