Java 在应用程序引擎中,以原子方式递增计数器的正确方法是什么?
我在GoogleAppEngine上使用Java,我最熟悉JDO数据存储接口。我试图实现一个简单的下载计数器,它将数据存储在AppEngine数据存储中 我只希望每月有几千次下载,所以我的计数器的更新率会很低。因此,我对分割柜台还不感兴趣Java 在应用程序引擎中,以原子方式递增计数器的正确方法是什么?,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我在GoogleAppEngine上使用Java,我最熟悉JDO数据存储接口。我试图实现一个简单的下载计数器,它将数据存储在AppEngine数据存储中 我只希望每月有几千次下载,所以我的计数器的更新率会很低。因此,我对分割柜台还不感兴趣 实际上,我可能会忽略锁定,并接受偶尔会丢失更新的事实。但是,我想知道在不丢失任何更新的情况下,正确的方法是什么。我知道在纯Java中我会使用同步,但我不清楚数据存储中的等效机制是什么。我在另一个答案中发现了这一点: int retries = 0; int N
实际上,我可能会忽略锁定,并接受偶尔会丢失更新的事实。但是,我想知道在不丢失任何更新的情况下,正确的方法是什么。我知道在纯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;
}
}
}
显然,如果被查询的实体在事务启动后已更新,则提交调用会引发异常 根据您的需求,有很多方法可以做到这一点,包括分片。另一个选项被描述。这只是一个标准事务,在数据存储下有最大更新率的标准问题。