tableIterator()の使用

TableAPI.tableIterator()では、非原子的な表の反復を実行できます。索引を反復するには、このメソッドを使用します。1より大きい同時要求サイズを設定した場合、このメソッドは表のパラレル・スキャンを実行します。

TableAPI.tableIterator()は、行のセット全体を一度に返しません。かわりに、イテレータ内の行のフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。また、このメソッドで返される行はソートされていません。

このメソッドでは1つの原子的操作にならないことに注意してください。取得がバッチ処理されるため、取得操作全体を行ううちに戻りセットが変更されることがあります。その結果、このメソッドを使用する場合、操作の原子性が失われます。

このメソッドでは、表内の行の未ソート走査を行えます。キーを指定しない場合、このメソッドは表のすべての行を反復します。

このメソッドを使用する場合、オプションで次のものを指定できます。

たとえば、次のように設計されている製品に関する情報を格納する表があるとします。

## Enter into table creation mode
table create -name myTable
## Now add the fields
add-field -type STRING -name itemType
add-field -type STRING -name itemCategory
add-field -type STRING -name itemClass
add-field -type STRING -name itemColor
add-field -type STRING -name itemSize
add-field -type FLOAT -name price
add-field -type INTEGER -name inventoryCount
primary-key -field itemType -field itemCategory -field itemClass
-field itemColor -field itemSize
shard-key -field itemType -field itemCategory -field itemClass
## Exit table creation mode
exit

次のようなデータを含む表:

最も簡単な例では、次のように「Hats」に関連するすべての行を取得できます。この単純な例は、TableAPI.multiGet()でも実行できることに注意してください。ただし、TableAPI.TableIteratorを使用すると、読取りは非原子的であり、複数のスレッドを使用するように構成できます。大量の読取りの場合、このメソッドはTableAPI.multiGet()を使用する場合よりもパフォーマンスが向上します。

package kvstore.basicExample;

...

import oracle.kv.KVStore;
import oracle.kv.table.PrimaryKey;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;
import oracle.kv.table.TableIterator;

...

// KVStore handle creation is omitted for brevity

...

TableAPI tableH = kvstore.getTableAPI();

// The name you give to getTable() must be identical
// to the name that you gave the table when you created
// the table using the CLI's 'table create' command.
Table myTable = tableH.getTable("myTable");

// Construct the PrimaryKey. In this case, we are
// using a partial primary key.
PrimaryKey key = myTable.createPrimaryKey();
key.put("itemType", "Hats");

// Exception handling is omitted, but in production code
// ConsistencyException, RequestTimeException, and FaultException
// would have to be handled.
TableIterator<Row> iter = tableH.tableIterator(key, null, null);
while (iter.hasNext()) {
    Row row = iter.next();
    // Examine your row's fields here
}