Sharding Counters 예제 (code.google.com/appengine/articles/sharding_counters.html)를 Java로 이식하려고합니다. 유일한 문제는 자바 API가 파이썬의 'get_by_key_name'과 비슷한 호출을 가지고 있지 않다는 것입니다.Java를 사용하여 Google AppEngine 데이터 스토어에 개체가 주어진 키에 존재하는지 확인하는 방법은 무엇입니까?
Transaction tx = pm.currentTransaction();
Key key = KeyFactory.createKey(CounterShard.class.getSimpleName(), counter + randomIndex);
CounterShard shard = pm.getObjectById(CounterShard.class, key);
if (shard == null) { // API does not work this way...
shard = new CounterShard(key, counter);
}
shard.increment();
pm.makePersistent(shard);
tx.commit();
불행하게도, 이것은 JDOObjectNotFoundException 내가 처음 실행할 때 발생합니다 : 이것은 기본적인 생각이다. 주어진 이름의 카운터가 있는지를 판별하기 위해 쿼리를 실행할 수는 있지만 트랜잭션이 아닙니다. 다른 스레드는 동일한 작업을 수행 할 수 있으며 결국에는 둘 다 동일한 키를 가진 객체를 생성합니다.
내가 이해 한대로, 트랜잭션 (Java API의 경우) 내에서 지원되는 유일한 조작은 get 및 put입니다. 그렇다면 내가 존재하지 않는 키 (예 : 'get')로 객체를 잠그고 내가 처음이자 유일한 객체인지 확인하십시오.
데모 코드? –
할 수는 있지만 여전히 트랜잭션 적이 아닙니다. 카운트가 "1"인 새 샤드를 생성하는 순간 다른 요청이 들어올 수 있습니다. 엔터티 그룹과 부모 키를 살펴 보겠습니다. 어쩌면 그것이 갈 길입니다. –
단일 거래 내에서 거래하는 경우 거래가 가능합니다. 커밋하기 전에 시도한 엔터티를 삽입하거나 업데이트 한 경우 (예상대로) 트랜잭션이 커밋되지 않습니다. 이것이 바로 Python SDK의 get_or_insert가 작동하는 방식입니다. –