8

私は以下のエンティティを持っています(非関連フィールド/メソッドは削除されています)。私はバッチをやろうとしているGoogleのデータストア(ハイレプリケーション)への1回のトランザクションで、「あまりにも多くの」オブジェクトがいくつ見つかりますか?

public class HitsStatsTotalDO 
{ 
    @Id 
    transient private Long targetId; 

    public Key<HitsStatsTotalDO> createKey() 
    { 
     return new Key<HitsStatsTotalDO>(HitsStatsTotalDO.class, targetId); 
    } 
} 

だから... ...私はHitsStatsTotalDO.createKey()を使用してキーを構築しているために10個のオブジェクトのために取得します。私はこのような取引でそれらを取得しようとしている:あなたはあまりにも多くのですどのように多くの手の込んだてもらえますし、それを修正する方法を

java.lang.IllegalArgumentException: operating on too many entity groups in a single transaction.

final List<Key<HitsStatsTotalDO>> keys = .... 

// This is being called in transaction.. 
Map<Key<HitsStatsTotalDO>, HitsStatsTotalDO> result = DAOBase.ofy().get(keys); 

次の例外をスローしていますか?私はドキュメントの正確な番号を見つけることができませんでした。

ありがとうございます!

答えて

5

問題は、取得しているエンティティの数ではなく、複数のエンティティグループに含まれているということです。トランザクション外でフェッチするか、XG (Cross Group) transactionを使用してください。

+0

うん、私は5つのエンティティについてその部分を逃した。 – expert

+1

少なくともPython SDK 1.7.3では、BadRequestErrorに対する2つの異なるエラーメッセージがあります。「グループ間のトランザクションを明示的に指定する必要があります.TransactionOptions.Builder.withXG」と「1つのトランザクション"。あなたの答えは前者を解決しますが、5つ以上のエンティティグループで動作する場合、後者はXGトランザクションで発生する可能性があります。 –

+0

XGトランザクションの場合、limitは25のエンティティグループに見えます。 https://cloud.google.com/appengine/docs/standard/java/datastore/transactions?csw=1#What_Can_Be_Done_In_a_Transactionをご覧ください。 – rimsky

1

単一のトランザクションでは、同じエンティティグループ内のエンティティを操作できます。

What Can Be Done In a Transaction

+1

ああ、高レプリケーションでは5です。あなたの答えも更新しました。 – expert

関連する問題