0

Я пытаюсь сохранить объект в хранилище данных Google App Engine только в том случае, если он не существует, если поток не должен продолжаться.Как сохранить объект в хранилище данных GAE только в том случае, если он не существует при предотвращении условий гонки

Основная проблема: я хочу предотвратить любые условия гонки, так что если 2 потока выполняют это одновременно, только одному удалось сохранить объект.

Я не уверен, что это лучший подход для этого, будет работать с использованием транзакций или один должны полагаться на другие решения, такие как использование Memcache

Просьба предоставить ответ на низкий уровень API в Java

ответ

1

Если предположить, что обе нити пытаются сохранить объект с же ключом, то этот код:

datastore.add(entity); 

будет делать то, что вы хотите. Если объект уже существует в хранилище данных с тем же ключом, то .add() генерирует исключение.

+0

не существует никакой функции называется добавить для класса DatastoreService, пожалуйста, вы можете указать мне на документацию для такой функции – man

+0

Нажмите на вкладку Java в этих docs: https://cloud.google.com/datastore/docs/concepts/entities –

+0

Полный источник java находится здесь: https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/datastore/src /test/java/com/google/datastore/snippets/ConceptsTest.java –

1

При вызове Datastore из App Engine, api отличается. Используйте транзакцию. Сначала попробуйте получить() сущность, чтобы увидеть, есть ли она там. Если нет, поместите() объект.

Вот пример кода, который демонстрирует транзакции с помощью App Engine API: https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/datastore/src/test/java/com/example/appengine/TransactionsTest.java