我注意到在使用数据存储区时在谷歌应用引擎上分配ID的问题。在我的应用程序中,我有一组必须最初上传的数据。已经在测试appengine环境上准备了数据,因此它具有ID字段的自动生成值。因为我想保留这些值,所以我通过使用带有Objectify的远程API作为一个单独的进程来重新创建实体。上传后,我想确保从autogenerator的值范围中删除使用过的ID。我正在使用DatastoreService.allocateIdRange,其范围为单个long值。在dev服务器上一切正常但在appspot上有一些值(16位数值)我收到“超出最大分配ID”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);
}
答案 0 :(得分:3)
这是allocateIdRange()的已知问题。更好的错误信息是"你不能在分散的ID上调用allocateIdRange()"。
分散的ID是自1.8.1以来的默认值,其值为> = 2 ^ 52。不幸的是,我们目前没有公开API来保留这些ID。
答案 1 :(得分:1)
听起来您可能正在尝试分配大于允许的最大ID的ID。这受到javascript中最大的整数大小的限制,即2 ^ 53。
的网页