一括取得操作では、パラレル・スキャンのように、各シャードのレコードを並列で取得および処理できます。ただし、検索条件としては1つのキーではなくキーのシーケンスを使用します。
一括取得操作では、一度にKVペアすべてがまとめて返されることはありません。かわりに、イテレータ内のKVペアのフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。バッチは複数のレプリケーション・ノードで並列でフェッチされます。クライアント側でより多くのスレッドを指定すると、取得のパフォーマンスが上がります(ただしプロセッサまたはネットワークのリソースが飽和状態になるまで)。
このためには、一括検索が含まれるKVStore.storeIterator()メソッドとKVStore.storeKeysIterator()メソッドのいずれかを使用します。これらは検索基準として1つのキーではなくキーのシーケンスを受け取ります。シーケンスはIterator<Key>値またはList<Iterator<Key>>値を使用して指定します。
これらのメソッドは、イテレータによって指定されたキーと一致するKVペアまたはキーを取得します。
イテレータによって複数のキーが生成されると、複数のキーに関連するKeyValueVersionが少なくとも1回返されます。複数回返されることもあります。
指定する親キーは、完全なメジャー・キー・パスを含む必要があります。マイナー・キー・パスは省略しても部分パスでもかまいません。
これらのメソッドを使用する場合、オプションで次のものも指定できます。
Depthパラメータ: 返す親キーの子の数を指定します。
KeyRangeパラメータ: 処理対象のレコード範囲を指定します。
StoreIteratorConfigクラス・インスタンスを使用するMaxConcurrentRequests: 一括取得操作の実行に使用されるスレッド数を構成します。
MaxConcurrentRequestsが指定されないと、使用可能なハードウェアに基づいてデフォルト値が計算されます。
たとえば、次のキーを使用するとします。
/Hats/-/baseball /Hats/-/baseball/longbill /Hats/-/baseball/longbill/blue /Hats/-/baseball/longbill/red /Hats/-/baseball/shortbill /Hats/-/baseball/shortbill/blue /Hats/-/baseball/shortbill/red /Hats/-/western /Hats/-/western/felt /Hats/-/western/felt/black /Pants/-/western/felt/gray /Pants/-/baseball/cotton /Pants/-/baseball/cotton/blue /Pants/-/baseball/cotton/red /Shoes/-/baseball/ /Shoes/-/baseball/blue /Shoes/-/baseball/red
9個のスレッドを並列で使用して、野球で使用されるすべての帽子とズボンを探す場合、メジャー・キー・コンポーネントHatsとマイナー・キー・コンポーネントbaseballを使用するレコードと、メジャー・キー・コンポーネントPantsとマイナー・キー・コンポーネントbaseballを使用するレコードすべてを次のように取得できます。
package kvstore.basicExample;
...
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import oracle.kv.Consistency;
import oracle.kv.Key;
import oracle.kv.StoreIteratorConfig;
import oracle.kv.ParallelScanIterator;
import oracle.kv.KeyValueVersion;
...
// KVStore handle creation is omitted for brevity
...
// Create the retrieval keys
Key myKey = Key.createKey("Hats","baseball");
Key myOtherKey = Key.createKey("Pants","baseball");
// Use multi-threading for this store iteration and limit the number of
// threads (degree of parallelism) to 9.
final StoreIteratorConfig storeIteratorConfig =
new StoreIteratorConfig().setMaxConcurrentRequests(9);
// Create the parent key iterator.
List<Key> searchKeys = new ArrayList<Key>();
// Add the retrieval keys to the list.
searchKeys.add(myKey);
searchKeys.add(myOtherKey);
final ParallelScanIterator<KeyValueVersion> iterator =
kvstore.storeIterator(searchKeys.iterator(),
0, //BatchSize
null, //SubRange
null, //Depth
Consistency.NONE_REQUIRED,
0, //Timeout
null,
storeIteratorConfig);
// Now retrieve the records.
try {
while (iterator.hasNext()) {
KeyValueVersion kvv = iterator.next();
// Do some work with the Value here
}
} finally {
if (iterator != null) {
iterator.close();
}
}