Как правильно увеличить счетчик в App Engine? - PullRequest
4 голосов
/ 09 ноября 2011

Я использую Java в Google App Engine, и я наиболее знаком с интерфейсом хранилища данных JDO. Я пытаюсь реализовать простой счетчик загрузок, который хранит свои данные в хранилище данных App Engine.

Я ожидаю только несколько тысяч загрузок в месяц, поэтому частота обновления моего счетчика будет довольно низкой. Поэтому я пока не заинтересован в расшаривании счетчика.

Прагматически я, вероятно, мог бы игнорировать блокировку и принять, что я иногда теряю обновление Тем не менее, я хотел бы знать, как правильно сделать это без потери каких-либо обновлений. Я знаю, что в чистой Java я бы использовал синхронизацию, но мне не ясно, каков эквивалентный механизм в хранилище данных.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Существует несколько способов сделать это в зависимости от ваших требований, включая шардинг. Другой вариант описан здесь .

0 голосов
/ 09 ноября 2011

Я нашел это в другом ответе:

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

Очевидно, что вызов commit генерирует исключение, если запрашиваемая сущность была обновлена ​​с момента запуска транзакции.

...