我注意到在使用数据存储时在谷歌应用引擎上分配 ID 时出现问题。在我的应用程序中,我有一组必须最初上传的数据。数据已在测试应用引擎环境中准备好,因此它具有自动生成的 ID 字段值。因为我想保留这些值,所以我通过使用远程 API 和 Objectify 作为一个单独的进程来重新创建实体。上传后,我想确保使用过的 ID 将从自动生成器的值范围中删除。我正在使用具有单个长值范围的 DatastoreService.allocateIdRange。在开发服务器上一切正常,但在 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);
}
最佳答案
这是 allocateIdRange() 的一个已知问题。更好的错误消息是“您不能在分散的 ID 上调用 allocateIdRange()”。
从 1.8.1 开始,分散的 id 是默认值,并且值 >= 2^52。遗憾的是,我们目前没有公开 API 来保留这些 ID。
关于java - GAE : Exception while allocating 16 digit ids,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22768416/