GAE: исключение при выделении 16-значных идентификаторов

1

Я замечаю проблему с назначением идентификаторов в движке Google для использования при использовании хранилища данных. В моем приложении у меня есть набор данных, которые должны быть первоначально загружены. Данные подготовлены в среде тестового приложения, так что у него есть автогенерированные значения для полей ID. Поскольку я хочу сохранить эти значения, я воссоздаю объекты, используя удаленный API с Objectify как отдельный процесс. После загрузки я хочу убедиться, что используемые идентификаторы будут удалены из диапазона значений для автогенератора. Я использую DatastoreService.allocateIdRange с диапазоном одного длинного значения. Все работает отлично на dev-сервере, но на appspot для некоторых значений (16 цифр) я получаю "Превышены максимальные выделенные идентификаторы" IllegalArgumentException.

Есть ли ограничение вызова allocateIdRange (я не нашел в документации)?

Ниже приведен пример кода, который я использую для выделения id для хранилища данных после загрузки:

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
String kind = Key.getKind(clazz);

PreparedQuery query = datastore.prepare(new Query(kind).setKeysOnly());
KeyRange keyRange = null;
Long id = null;

for (Entity entity : query.asIterable()) {
    id = (Long) entity.getKey().getId();
    keyRange = new KeyRange(null, kind, id, id);
    DatastoreService.KeyRangeState state = datastore.allocateIdRange(keyRange);
}
Теги:
google-app-engine
google-cloud-datastore

2 ответа

3

Это известная проблема с allocateIdRange(). Лучшее сообщение об ошибке: "Вы не можете вызывать allocateIdRange() для разбросанных идентификаторов".

Рассеянные идентификаторы по умолчанию имеют значение 1.8.1 и имеют значения> = 2 ^ 52. К сожалению, в настоящее время мы не предоставляем API для резервирования этих идентификаторов.

  • 0
    Неполная документация Google может приводить в бешенство !!! Я делаю существенную переписать свое приложение на основе allocate_id_range и я проверил его на более старом, меньшем идентификаторе, и он работал нормально. Теперь я обнаружил, что это не работает для новых, более крупных идентификаторов, и я потратил огромное количество времени.
1

Похоже, вы пытаетесь выделить идентификатор, превышающий максимально допустимый ID. Это ограничено наибольшим размером в javascript, который равен 2 ^ 53.

Вот страница, описывающая ограничение на App Engine и самый большой javascript int.

  • 0
    Спасибо за ваш ответ, но я использую идентификаторы, которые были ранее сгенерированы GAE - и меньше чем 2 ^ 53.
  • 0
    Хм. Я бы порекомендовал заполнить рабочий билет на сайте App Engine, чтобы вы могли предоставить свой идентификатор приложения, и кто-то может более подробно изучить ваше приложение: code.google.com/p/googleappengine/issues/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню