我永远不会创建足够多的实体来耗尽 63 位地址空间,但假设我使用 allocateIdRange 分配了 id 9223372036854775807(几乎是 2^63)。那种实体是否刚刚被新的、自动输入的实体破坏了?
我在测试应用程序中对此进行了尝试。似乎自动 IDer 的一些分片可以继续生成有效的 ID,但其他分片只是给出一个 DatastoreFailureException
。成功率约为30%。它会上涨吗?
这实际上是一个严肃的问题,因为我天真地创建了一些相当大的 ID。在我达到这个限制之前,我还有几万亿个实体要经过,但我注意到实体之间的 ID 可以跳跃数百万,并且我以每年大约一百万的速度输入新实体。所以……我害怕达到这个极限。
最佳答案
在测试应用程序中,我使用 allocateIdRange
保留了一堆非常高的 ID。起初,我尝试放置新实体的尝试大约有一半成功了。现在,没有新实体可以用空白 ID 放置 - 每次都会引发 DatastoreFailureException
。我认为这是因为 key 分配器实现不会跟踪 key 中的间隙,而只会跟踪目前给出的最高 ID。
我看不出有什么方法可以为这个 Kind 重置计数器,所以我认为唯一的解决办法是选择一个新的 Kind
名称。
教训:不要在 2^63 附近的任何地方使用 ID!
关于google-app-engine - 当我在 AppEngine 上用完 ID 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071718/