Я замечаю проблему с назначением идентификаторов в движке 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);
}
Это известная проблема с allocateIdRange(). Лучшее сообщение об ошибке: "Вы не можете вызывать allocateIdRange() для разбросанных идентификаторов".
Рассеянные идентификаторы по умолчанию имеют значение 1.8.1 и имеют значения> = 2 ^ 52. К сожалению, в настоящее время мы не предоставляем API для резервирования этих идентификаторов.
Похоже, вы пытаетесь выделить идентификатор, превышающий максимально допустимый ID. Это ограничено наибольшим размером в javascript, который равен 2 ^ 53.
Вот страница, описывающая ограничение на App Engine и самый большой javascript int.
allocate_id_range
и я проверил его на более старом, меньшем идентификаторе, и он работал нормально. Теперь я обнаружил, что это не работает для новых, более крупных идентификаторов, и я потратил огромное количество времени.