在App Engine中以原子方式递增计数器的正确方法是什么?

时间:2011-11-08 23:33:00

标签: java google-app-engine jdo

我在Google App Engine上使用Java,而且我最熟悉JDO数据存储区界面。我正在尝试实现一个简单的下载计数器,它将其数据存储在App Engine数据存储区中。

我只希望每月下载几千个,所以我的柜台的更新率会非常低。因此,我对分析计数器并不感兴趣。

务实地我可能会忽略锁定并接受我偶尔会丢失更新。但是,我想知道正确的方法是做什么而不会丢失任何更新。我知道在纯Java中我会使用同步,但我不清楚数据存储区中的等效机制是什么。

2 个答案:

答案 0 :(得分:1)

根据您的要求,有很多方法可以做到这一点,包括分片。另一个选项是here

答案 1 :(得分:0)

我在另一个答案中找到了这个:

int retries = 0;
int NUM_RETRIES = 10;
while (true) // break out below                                                                                                                             
{
    retries++;
    pm.currentTransaction().begin();
    Object obj = pm.getObjectById(getTargetClass(), getKey());
    // Make update to obj                                                                                                                                   
    try
    {
        pm.currentTransaction().commit();
        break;
    }
    catch (JDOCanRetryException ex)
    {
        if (retries == NUM_RETRIES)
        {
            throw ex;
        }
    }
}

显然,如果被查询的实体自事务启动以来已更新,则提交调用将引发异常。