这是你应该担心的事情。
当您的应用在特定时间段内没有任何请求时,Google App Engine 会启动一个新的 JVM 来处理请求。从“冷”获取数据存储的句柄 - 即第一次在 JVM 中 - 可能需要相当长的时间,多达 5 秒以上。
在您处理完数据存储(通常是 PersistenceManager 的实例)之后,一切都很好(在 JVM 的生命周期内!)。
编辑:
在 GAE-Java 中启动新的 JVM 也很慢。阅读http://code.google.com/appengine/docs/java/datastore/overview.html,您会看到他们使用单例类来获得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 命名
交易 - 可选,但有一个
这个名字已经存在!实例
PersistenceManagerFactory 是
创建速度极慢,而且它是
通常不需要创建一个
多次使用给定名称。
相反,创建一个单例并共享
它贯穿你的代码。如果你
确实需要创建一个副本
PersistenceManagerFactory(例如对于
一个单元测试套件),设置
appengine.orm.disable.duplicate.pmf.exception
系统属性来避免这个错误。
我认为我不需要再提供任何证据证明在应用引擎中处理数据存储是缓慢的。