Это то, о чем вы должны беспокоиться.
Google App Engine раскручивает новую JVM для запросов на обслуживание, когда в вашем приложении не было запросов в течение определенного периода времени. Получение дескриптора хранилища данных из «холодного» состояния, т. Е. Впервые в JVM, может занять значительное время, до 5+ секунд.
После того, как у вас есть дескриптор хранилища данных (обычно это экземпляр PersistenceManager
), все в порядке (для жизни JVM!).
EDIT:
Раскрутка новой виртуальной машины Java в GAE-Java также идет медленно. Прочитайте 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 named
транзакции необязательны, но с
Это имя уже существует! Инстансы
PersistenceManagerFactory являются
очень медленно, чтобы создать, и это
обычно нет необходимости создавать
с указанным именем более одного раза.
Вместо этого создайте синглтон и поделитесь
это по всему вашему коду. если ты
действительно нужно создать дубликат
PersistenceManagerFactory (например, для
пакет unittest), установите
appengine.orm.disable.duplicate.pmf.exception
Системное свойство, чтобы избежать этой ошибки.
Я не думаю, что мне нужно предоставлять какие-либо дополнительные доказательства того, что получение дескриптора хранилища данных в движке приложения МЕДЛЕННО.