Что такое база данных AppEngine «время холодного запуска»? - PullRequest
8 голосов
/ 03 мая 2010

Одна из наиболее распространенных жалоб, которые я читал о базе данных AppEngine (для Java), заключается в том, что она очень медленная, когда дело доходит до «времени холодного запуска». Что это значит? И это то, что меня должно волновать?

1 Ответ

10 голосов
/ 03 мая 2010

Это то, о чем вы должны беспокоиться.

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 Системное свойство, чтобы избежать этой ошибки.

Я не думаю, что мне нужно предоставлять какие-либо дополнительные доказательства того, что получение дескриптора хранилища данных в движке приложения МЕДЛЕННО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...