一括取得操作
一括取得操作では、パラレル・スキャンのように、各シャードのレコードを並列で取得および処理できます。ただし、検索条件としては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();
}
}