“超出最大分配ID” - 分配KeyRange时出现异常(AppEngine Objectify)

时间:2015-09-18 12:42:07

标签: java google-app-engine objectify

我正在将一些实体从旧的appengine应用程序迁移到一个新的应用程序(除了其他实体之外的一个原因是升级到物体化5)。

还有一些实体具有自动生成的长ID。现在,我必须在新数据存储上重新allocate the ids(另请参阅javadocthis讨论)。

这是重要的路线:

Long id = anEntity.getId();
com.google.appengine.api.datastore.KeyRange keyRange = new com.google.appengine.api.datastore.KeyRange(null, AnEntity.class.getName(), id-1l, id+1l);

KeyRange<AnEntity> keys = new KeyRange<>(keyRange);

OfyService.ofy().factory().allocateIdRange(keys);

但是,这不起作用,因为抛出了以下异常:

java.lang.IllegalArgumentException: Exceeded maximum allocated IDs
    at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:54)
    at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:127)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:96)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:88)
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:76)
    at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:36)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.allocateIdRange(DatastoreServiceImpl.java:121)
    at com.googlecode.objectify.ObjectifyFactory.allocateIdRange(ObjectifyFactory.java:335)

我进一步测试了发现该行

KeyRange(null, AnEntity.class.getName(), 1, 1000000000l);

会奏效。但是,我已经生成的ID在4503908059709440到6754883239673856范围内,因此显然太高了。

  1. 我是否犯了一些错误,或者allocateIdRange-method不支持如此大的ID(如提示here a long ago)?

  2. 如果是后者,我怎么能解决这个问题呢? (我想在一定范围内生成新的ID,但here他们说遗留的方式很快就会被删除......此外我不喜欢自己生成它的想法。)

  3. 系统: - Java 7 - AppengineSDK 1.9.21 - 客观化版本:4.1.3(如上所述,我正在迁移)

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已经更改了代码,以便它分配一个String并使用UUID生成This String。 这解决了问题,但仍然是allocateIdRange ...

的奇怪行为

另见issue