2009-05-23 2 views
4

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')로 객체를 잠그고 내가 처음이자 유일한 객체인지 확인하십시오.

+0

데모 코드? –

+0

할 수는 있지만 여전히 트랜잭션 적이 아닙니다. 카운트가 "1"인 새 샤드를 생성하는 순간 다른 요청이 들어올 수 있습니다. 엔터티 그룹과 부모 키를 살펴 보겠습니다. 어쩌면 그것이 갈 길입니다. –

+0

단일 거래 내에서 거래하는 경우 거래가 가능합니다. 커밋하기 전에 시도한 엔터티를 삽입하거나 업데이트 한 경우 (예상대로) 트랜잭션이 커밋되지 않습니다. 이것이 바로 Python SDK의 get_or_insert가 작동하는 방식입니다. –

답변

2

체크 방금 JDOObjectNotFoundException을 잡을 경우에 개체를 만들 수 없습니다 여기

http://code.google.com/p/googleappengine/source/browse/trunk/java/demos/shardedcounter/README

+0

예제를 지적 해 주셔서 감사합니다. 자세히 살펴 보았지만 Java 예제가 트랜잭션 적이 지 않은 것으로 결론을 내 렸습니다. 즉, 생성되기 전에 샤드가 증가 할 가능성이 있습니다. ShardedCounter.increment (int)를 살펴보십시오. 주어진 인덱스를 가진 샤드 (shard)를 찾는다. 찾지 못하면 그냥 버립니다. 또한 트랜잭션이나 잠금 메커니즘을 사용하지 않는 것 같습니다. 샤드가 동시에 업데이트되면 어떻게 될까요? 나는 뭔가를 놓치고 있어야합니다 ... –

관련 문제