java - GAE : Exception while allocating 16 digit ids

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

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

相关文章:

java - GAE + Spring MVC : Saving image file to BlobStore

java - 谷歌应用引擎: new instance with no user data

google-app-engine - 谷歌应用引擎数据存储中的主键

google-app-engine - 如何过滤 GAE 查询?

java - 流式传输和过滤列表中包含的子列表中的数据

java - 如何使用java知道特定文件是否仍然打开或关闭

python - Google App Engine - 导入我自己的源模块(多个文件)

java - Google App Engine 本地数据存储查看器无法正常工作?

Java输出一个文件到屏幕

java - 在属性文件中转义 json 字符串