如何使用Java确定Google AppEngine数据存储区中给定键的对象是否存在?

时间:2009-05-23 20:15:11

标签: java google-app-engine sharding google-cloud-datastore

我正在尝试将Sharding Counters示例(code.google.com/appengine/articles/sharding_counters.html)移植到Java。唯一的问题是Java API没有类似于Python的'get_by_key_name'的调用。这是基本的想法:

            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 个答案:

答案 0 :(得分:2)