4

我正在尝试将分片计数器示例 (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')并确保我是第一个也是唯一一个创建它的对象?

4

1 回答 1

2

在此处查看演示代码

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

于 2009-05-24T05:18:18.303 回答