Appengine datastore фантомное юридическое лицо - противоречивое состояние? - PullRequest
2 голосов
/ 13 июня 2010

Получение странной ошибки в коде Java Appengine, который работал нормально (ничего не изменилось, кроме данных в хранилище данных).

Я пытаюсь перебрать результаты запроса и изменить несколько свойств сущностей. Запрос возвращает набор результатов, однако, когда я пытаюсь получить доступ к первому результату в списке, он выдает исключение при попытке доступа к любому из его свойств (кроме его ключа). Вот исключение:

org.datanucleus.state.JDOStateManagerImpl isLoaded: Exception thrown by StateManager.isLoaded
Could not retrieve entity of kind OnTheCan with key OnTheCan(3204258)
org.datanucleus.exceptions.NucleusObjectNotFoundException: Could not retrieve entity of kind OnTheCan with key OnTheCan(3204258)
 at org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapEntityNotFoundException(DatastoreExceptionTranslator.java:60)

А вот и мой код:

PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = null;
List<OnTheCan> cans;
query = pm.newQuery("SELECT this FROM " + OnTheCan.class.getName() + " WHERE open == true ORDER BY onTheCanId ASC");
query.setRange(0, num);
cans = (List<OnTheCan>) query.execute();
for (OnTheCan c : cans)
{
 System.err.println(c.getOnTheCanId()); // this works fine! getting the key works
 c.setOpen(false); // failure here with the above exception
 c.setAutoClosed(true);
 c.setEndTime(new Date(c.getStartTime().getTime() + 600000/*10*60*1000*/));
}
pm.close();

Код выдает исключение при попытке выполнить c.setOpen (false) - это первый раз, когда я получаю доступ или задаю свойство, которое не является ключом. Похоже, в моем хранилище данных есть фантомная сущность с ключом 3204258. Эта сущность на самом деле не существует (запрашивает хранилище данных из консоли администратора), но по какой-то причине она возвращается запросом. Может ли мое хранилище данных находиться в несогласованном состоянии?

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

if (c.getOnTheCanId () == 3204258) { Продолжить; }

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Я думаю, что один из ваших индексов мог быть поврежден. Возможно, вам придется проверить http://appengine.google.com/datastore/indexes?&app_id={your_app_id} и посмотреть, если какой-либо из них сообщит об ошибке. Если это так, то их, возможно, потребуется восстановить.

Это может быть полезно (взято из http://osdir.com/ml/GoogleAppEngine/2009-05/msg00904.html):

Чтобы очистить и восстановить ваши индексы:

  1. Создайте резервную копию вашей спецификации index.yaml.
  2. Определите индексы в состоянии ERROR из консоли администратора: http://appengine.google.com/datastore/indexes?&app_id={app_id}
  3. Удалите определения индексов в ОШИБКЕ из файла index.yaml.
  4. Запустите "appcfg.pyuum_indexes your_app_dir /"
  5. Подождите, пока индексы ERROR больше не появятся в консоли администратора.
  6. Замените измененную версию файла index.yaml оригинальной.
  7. Запустите "appcfg.py update_indexes your_app_dir /"
0 голосов
/ 22 июня 2010

Вероятно, это повреждение индекса, как сказал Андрей, но если вы не хотите перестраивать все свои индексы, попробуйте удалить только эту сущность.Примерно так:

  if (c.getOnTheCanId() == 3204258) {
            //continue;
            pm.deletePersistent(c); 
        }

После того, как вы сможете протестировать его снова без предложения if ...


ОК, есть несколько других вещей, которые вы можете попробовать

  1. Проверьте свои автоматические и пользовательские индексы (файл index.yaml).Посмотрите, если вы больше не используете какой-либо запрос, но он все равно проиндексирован.Возможно, именно поэтому у вас неверная таблица индексов.

  2. Проверьте, можете ли вы запросить объект с этим идентификатором.Например:

    Key k = KeyFactory.createKey (OnTheCan.class.getSimpleName (), 3204258);pm.getObjectById (OnTheCan.class, k);

    и затем попытайтесь удалить его.

  3. Проверьте, можете ли вы получить свойства объекта, возможно, этодругой вид, который вы ожидаете.

...