2016-09-13 6 views
3

次の2つのコードセグメントの違いを理解しようとしています。 1つはページを使用してスキャン結果を取得し、2つ目はスキャン結果を取得しません。データベース内のアイテムの総数が非常に多い場合、2番目のアプローチが機能するかどうかは疑問です。 AWSのドキュメントによると、スキャン結果は1Mbで制限されています。これはバージョン2にどのような影響を及ぼしますか?最初の1 MBの結果しか得られないのでしょうか、それとも各ページの後もデータベース呼び出しを行いますか?ページ分割ありとなしのDynamoDB Table.scan

私は、DynamoDBClient.scan apiとは異なるtable.scan APIを使用しています。 APIの詳細については、http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.htmlを参照してください。

バージョン1(使用してページ):(ページなしのアイテムを反復処理)

  ItemCollection<ScanOutcome> items = table.scan(spec); 
      items.pages().forEach(page -> { 
       for (Item item : page) { 
        response.add(item); 
       } 
      }); 

バージョン2:

  ItemCollection<ScanOutcome> items = table.scan(spec); 
      for (Item item : items) { 
        response.add(item); 
      } 

答えて

2

Tofigが正しい。これらの2つの方法には違いはありません。スキャン結果が1 MBに制限されているという記述は、Document API用ではない低レベルAPIに対してのみ当てはまります。 ItemCollection

項目ののコレクションのドキュメントから
。 ItemCollectionオブジェクトは、現在のデータページを指すカーソル を保持します。最初のカーソルは、最初のページの前に配置された です。次のメソッドはカーソルを の次の行に移動し、ItemCollectionオブジェクト内に行がなくなったときにfalseを返すため、whileループで にコレクションを反復処理することができます。 コレクションがページ境界をまたいで反復されると、ネットワークコールがトリガーされます

0

は私が5キロバイトのサイズごとに1000件のレコードを作成して実験を行いました。それから私はテーブルをスキャンするためにバージョン2を使用しましたが、合計サイズは明らかに> 1MBですが、まだ1000レコードがあります。両方のバージョンがテーブル全体をスキャンしたので、違いはありません。それは、ItemCollectionがあなたのページングを処理しているようで、ネットワークコールやページサイズを制御しない限り、ページを使う必要はありません。