2014-03-31 52 views
1

我注意到在使用數據存儲時在Google應用引擎上分配ID時遇到問題。在我的應用程序中,我有一組必須首先上傳的數據。數據已在測試appengine環境中準備好,因此它已爲ID字段自動生成值。由於我想保留這些值,我正在通過使用Objectify的遠程API作爲單獨的進程來重新創建實體。上傳後,我想確保已使用的ID將從自動生成器的值範圍中刪除。我使用DatastoreService.allocateIdRange與單個長值的範圍。一切工作正常dev服務器上,但在appspot的一些值(16位數值)我收到「超過最大分配的ID」IllegalArgumentException。GAE:分配16位ID時出現異常

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); 
} 

回答

1

這聽起來像你可能會嘗試分配比最大允許的ID大的ID。這受限於JavaScript中最大的整數大小,即2^53。

以下是描述App Engine limitationlargest javascript int的頁面。

+0

感謝您的回答,但我使用的是之前由GAE生成的ID,並且小於2^53。 – user3482048

+0

嗯。我建議您在App Engine網站上提交生產許可證,以便您可以提供您的應用ID,並且有人可以更深入地查看您的應用:https://code.google.com/p/googleappengine/issues/entry?模板=製作%20issue –

3

這是allocateIdRange()的一個已知問題。更好的錯誤信息是「你不能在分散的id上調用allocateIdRange()」。

分散式ID是1.8.1以來的默認值,其值> = 2^52。不幸的是,我們目前沒有公開API來保留這些ID。

+0

谷歌的不完整文檔可能會令人生氣!我正在基於'allocate_id_range'對我的應用程序進行重要的重寫,並且在較舊的較小的ID上測試了它,並且它工作正常。現在我發現它不適用於更新,更大的ID,我浪費了大量時間。 –