什么是AppEngine数据库"冷启动时间"?

Iss*_*ual 8 database google-app-engine

我读过的关于AppEngine数据库(对于Java)的一个更常见的抱怨是它在"冷启动时间"时非常慢.这是什么意思?这是我应该担心的吗?

Fin*_*arr 10

这是你应该担心的事情.

当您的应用在特定时间段内没有任何请求时,Google App Engine会启动新的JVM来处理请求.从"冷"处理数据存储 - 即在JVM中第一次 - 可能需要相当长的时间,多达5秒以上.

掌握了数据存储区(通常是一个实例PersistenceManager)之后,一切都很好(对于JVM的生命周期!).

编辑:

在GAE-Java中启动新的JVM也很慢.阅读http://code.google.com/appengine/docs/java/datastore/overview.html,你会看到他们使用Singleton类来获取a的可用性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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑编辑编辑:

我更改了我的代码,以便它为PersistenceManagerFactory每个请求实例化一个,现在它抛出500个服务器错误,并在日志中:

javax.jdo.JDOFatalUserException:应用程序代码尝试创建名为transactions-optional的PersistenceManagerFactory,但已存在具有此名称的名称!PersistenceManagerFactory的实例创建起来非常慢,通常不需要多次创建具有给定名称的实例.相反,创建一个单例并在整个代码中共享它.如果确实需要创建重复的PersistenceManagerFactory(例如用于unittest套件),请设置appengine.orm.disable.duplicate.pmf.exception系统属性以避免此错误.

我认为我不需要再提供任何证据证明在应用程序引擎中获取数据存储区的句柄是缓慢的.

  • 请注意,这与数据存储区无关 - App Engine是一个平台. (2认同)