GAE:分配16位数字ID时出现异常

时间:2014-03-31 17:38:41

标签: java google-app-engine google-cloud-datastore

我注意到在使用数据存储区时在谷歌应用引擎上分配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);
}

2 个答案:

答案 0 :(得分:3)

这是allocateIdRange()的已知问题。更好的错误信息是"你不能在分散的ID上调用allocateIdRange()"。

分散的ID是自1.8.1以来的默认值,其值为> = 2 ^ 52。不幸的是,我们目前没有公开API来保留这些ID。

答案 1 :(得分:1)

听起来您可能正在尝试分配大于允许的最大ID的ID。这受到javascript中最大的整数大小的限制,即2 ^ 53。

以下是描述App Engine limitationlargest javascript int

的网页