Подтвердить что ты не робот

Проверка наличия сущности в хранилище данных Google.

Каков наилучший/самый быстрый способ проверить, существует ли сущность в хранилище данных google-app-engine? Пока я пытаюсь получить сущность по ключу и проверять, возвращает ли get() ошибку.

Я не знаю процесс получения сущности в хранилище данных. Есть ли более быстрый способ выполнить только эту проверку?

4b9b3361

Ответ 1

com.google.appengine.api устарел в пользу клиента GCS App Engine.

Рассматривали ли вы использование запроса? Guess-and-check не является масштабируемым способом поиска сущности в хранилище данных. Запрос может быть создан для извлечения объектов из хранилища данных, которые удовлетворяют заданному набору условий:

https://developers.google.com/appengine/docs/java/datastore/queries

EDIT:

Как насчет запроса только для ключей? Запросы только для ключей выполняются быстрее, чем запросы, возвращающие полные объекты. Чтобы вернуть только ключи, используйте метод Query.setKeysOnly().

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly();

Источник: [1]: http://groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1

Ответ 2

То, что вы предложили, действительно будет самым быстрым способом узнать, существует ли ваша сущность. Единственное, что замедляет вас, - это время, необходимое для получения и десериализации вашего объекта. Если ваш объект большой, это может замедлить работу.

ЕСЛИ это действие (проверка существования) является основным узким местом для вас, и у вас есть крупные сущности, вы можете захотеть свернуть свою собственную систему проверки с помощью двух объектов - сначала у вас будет существующая сущность с данными и второй объект, который либо сохраняет ссылку на реальный объект, либо, возможно, пустую сущность, где ключ является просто вариацией исходного ключа сущности, который вы можете вычислить. Вы можете быстро проверить существование с помощью второго объекта, а затем извлечь первый объект только в том случае, если необходимы данные.

Лучший способ, я думаю, просто состоит в том, чтобы проектировать ваши ключи таким образом, что вы знаете, что не было бы дубликатов или что ваши операции идемпотентны, так что даже если бы старый объект был перезаписан, это не имело бы значения.

Ответ 3

Вы можете получить с помощью List<Key>, содержащего только один Key, этот метод возвращает Map<Key, Entity>, который вы можете проверить, если это содержит фактическое значение или null, например:

Entity e = datastoreService.get(Arrays.asList(key)).get(key);

В общем, хотя я думаю, что было бы проще обернуть get() в try/catch, который возвращает null, если поймано EntityNotFoundException.