2017-12-25 18 views
0

Salesforce fetchSize = 100を設定しましたが、クエリのために100の要素をフェッチしません。したがって、ConsumerIteratorからの単一の結果をリストに集めて、バッチプロセスに100のセットで渡すことができるようにしたいと考えています。以下のコードがあります。これは正しい方法ですか?私はそれを正しく行う方法に関する提案を感謝します。すべてのConsumerIterator要素を50のバッチで処理したいと思います。そのバッチが50未満の場合、そのバッチを処理したいと思います。私の試みは、Salesforceのクエリでスレッドセーフな方法でコレクションを繰り返しながらリスト内の要素を集める

ConsumerIterator<HashMap<String,Object>> iter= 
        (ConsumerIterator<HashMap<String,Object>>)obj; 
    List<HashMap<String,Object>> l=new CopyOnWriteArrayList<>(); 
    while(iter.hasNext()){ 
    Object payload=iter.next(); 
    if(l.size()<50){ 
     l.add((HashMap<String,Object>)payload); 
    }else{ 
    write(l); 
    } 

    public int [] write(List<HashMap<String,Object> list) 
    { 
    synchronized(list) 
    { 
     ArrayList newList=copy(list); 
     save(newList); 
    } 

+

+0

投稿されたコードでは、 'l'は他のスレッドには見られません。したがって、' CopyOnWriteArrayList'を使用せず、 'synchronized(list)'を使うことも本当に必要です。対照的に、コードスニペットからは、 'obj'かその基礎となるデータソースがスレッド間で共有されているかどうかわからないので、それを反復するのが正しいかどうかは言うことができません。それに加えて、ジェネリック型、生の型、不要な型情報の削除は、既知の型を持つ項目を 'Object'に割り当て、それに続いて避けることのできないキャストを渡します。あなたはそのコードをクリーンアップする必要があります... – Holger

答えて

0

を下回っている、あなたは "リミット100;" を追加することができますクエリの最後にリスト内の要素を100個だけ取得します。

+0

制限は100要素をもたらすだけです。私はfetchSize = 100を設定しましたが、すべてのデータが100のページで返されます。問題は、ConsumerIteratorが要素を1つずつ返すだけで、リスト内でそれらを収集する必要があるということです。私が求めているのは、これらの要素を効率的かつ正確に収集する方法です。 – BreenDeen

0

フェッチサイズ100を使用して問題を解決し、結果のConsumerIteratorを使用して要素を集計しました。

関連する問題