Java 在应用程序引擎中,以原子方式递增计数器的正确方法是什么?

Java 在应用程序引擎中,以原子方式递增计数器的正确方法是什么?,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我在GoogleAppEngine上使用Java,我最熟悉JDO数据存储接口。我试图实现一个简单的下载计数器,它将数据存储在AppEngine数据存储中 我只希望每月有几千次下载,所以我的计数器的更新率会很低。因此,我对分割柜台还不感兴趣 实际上,我可能会忽略锁定,并接受偶尔会丢失更新的事实。但是,我想知道在不丢失任何更新的情况下,正确的方法是什么。我知道在纯Java中我会使用同步,但我不清楚数据存储中的等效机制是什么。我在另一个答案中发现了这一点: int retries = 0; int N

我在GoogleAppEngine上使用Java,我最熟悉JDO数据存储接口。我试图实现一个简单的下载计数器,它将数据存储在AppEngine数据存储中

我只希望每月有几千次下载,所以我的计数器的更新率会很低。因此,我对分割柜台还不感兴趣


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

我在另一个答案中发现了这一点:

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;
        }
    }
}

显然,如果被查询的实体在事务启动后已更新,则提交调用会引发异常

根据您的需求,有很多方法可以做到这一点,包括分片。另一个选项被描述。

这只是一个标准事务,在数据存储下有最大更新率的标准问题。