AppEngine Сохранять задержку объекта? - PullRequest
0 голосов
/ 09 мая 2011

Моя ситуация выглядит следующим образом:
У меня есть список сессий в моей таблице.
В моем коде я проверяю, есть ли место для последнего сеанса в хранилище данных для дополнительного игрока.
Если нет, создайте новый сеанс.

Это выглядит примерно так:

public Session getEligeableSession(){
    Session session;
    session = ds.getLastSession();
    if(session.numPlayers > 3){
        newSession();
        session = ds.getLastSession();
    }
    return session;
}

Это работает безупречно на локальном компьютере, но не на AppSpot AppEngine.
В AppSpot я просто получаю заполненный сеанс обратно, из этого я должен сделать вывод, что мой код не ждет, пока новый сеанс полностью сохранится, и просто снова получает старый сеанс.

Правильно ли сделан мой вывод? если так, как бы я поступил так любезно.
Поиск этой «задержки» ничего не дал в Google / SO, что заставляет меня поверить, что такой вещи нет (иначе она синхронна), и в моем коде произошла другая ошибка (возможно, получение последнего объекта из списка работает иначе в AppEngine)

Любая помощь / совет очень ценится.

Резюме:

Сессия (Объект) имеет (Список) 4 игроков (Объект)
getLastSession () извлекает весь список из хранилища данных и получает последний ( size-1 ).
newSession () создает новый объект Session и сохраняет его.

РЕДАКТИРОВАТЬ за запрос:

public List<Session> getAll(){
    pm = PMF.get().getPersistenceManager();
    String query = "select from " + Session.class.getName();
    @SuppressWarnings("unchecked")
    List<Session> sessions = (List<Session>) pm.newQuery(query).execute();
    return sessions;
}


public Session getLastSession(){
    List<Session> sessions = getAll();
    Session session = sessions.get(sessions.size()-1);
    session.activeGame = session.numPlayers == 4 ?  true : false;
    pm.close();
    return session;
}


    public int insert(Session session){
    pm = PMF.get().getPersistenceManager();
    int status = 0;
    try {
        pm.makePersistent(session);
    } finally {
        pm.close();
    }
    return status;
}

Код кажется «Разумным», никаких смешных вещей не происходит на самом деле. Я использую опцию master-slave.

1 Ответ

1 голос
/ 09 мая 2011

Просто предположение, потому что я не знаю, как вы реализовали свои методы, но если вы используете два разных экземпляра PersistenceManager в двух разных сервлетах (один для хранения объекта и один для его получения) возможно, вы получаете доступ к двум различным серверам сразу один за другим, не давая достаточно времени для репликации данных на серверах хранилища данных.

Посмотрите также на первый ответ в этой теме для альтернативного объяснения (хотя, в зависимости от того, как работает newSession();, это может быть не так):

http://groups.google.com/group/google-appengine/browse_thread/thread/2b4f6ec57031f53c/fc967c034e4a113f

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...