storeIterator()の使用
メジャー・キー・コンポーネントの一部のみ一致するレコードをすべて取得する場合、KVStore.storeIterator()
を使用します。このメソッドを使用すると、ストア内のすべてのレコードを反復することも、メジャー・コンポーネントの部分的なセットに一致するすべてのレコードを反復することもできます。
KVStore.storeIterator()
は、レコードのセット全体を一度に返しません。かわりに、イテレータ内のキーと値のペアのフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。また、このメソッドで返されるレコードはソートされていません。
このメソッドでは1つの原子的操作にならないことに注意してください。取得がバッチ処理されるため、取得操作全体を行ううちに戻りセットが変更されることがあります。その結果、このメソッドを使用する場合、操作の原子性が失われます。
このメソッドでは、ストア内のレコードの未ソート走査を行えます。キーを指定しない場合、このメソッドはストア内のすべてのレコードを反復します。キーを指定する場合、レコードで使用されているメジャー・キー・コンポーネントの一部のみを指定する必要があります。指定するキーには、マイナー・キー・コンポーネントを含めないでください。
このメソッドを使用するには、少なくとも次のものを指定する必要があります。
-
走査方向。
-
各ネットワーク往復でフェッチするキーの推奨数。値0を指定すると、内部的に決められたデフォルトが使用されます。
ストアのすべてのキーに対して、この最小限の指定が反復されます。また、指定した親キーのすべての子孫に対して反復できます。キー範囲を指定することもできます。
StoreIteratorConfig.setMaxConcurrentRequests
が1以外の場合、このメソッドはレコードの単一スレッド取得を実行します。ストアからのデータの取得に複数のスレッドを使用するパラレル・スキャンを使用すると、パフォーマンスが上がる可能性があります。詳細は「パラレル・スキャン」を参照してください。
たとえば、次のようなキーを使用するユーザー・レコードを格納しているとします。
/Smith/Bob/-/birthdate
/Smith/Bob/-/phonenumber
/Smith/Bob/-/image
/Smith/Bob/-/userID
/Smith/Patricia/-/birthdate
/Smith/Patricia/-/phonenumber
/Smith/Patricia/-/image
/Smith/Patricia/-/userID
/Smith/Richard/-/birthdate
/Smith/Richard/-/phonenumber
/Smith/Richard/-/image
/Smith/Richard/-/userID
/Wong/Bill/-/birthdate
/Wong/Bill/-/phonenumber
/Wong/Bill/-/image
/Wong/Bill/-/userID
最も簡単な例として、姓がSmithであるすべてのユーザーのすべてのレコードを取得するには、次のようにします。
package kvstore.basicExample;
...
import oracle.kv.Direction;
import oracle.kv.Key;
import oracle.kv.Value;
import oracle.kv.KeyValueVersion;
import java.util.ArrayList;
import java.util.Iterator;
...
ArrayList<String> majorComponents = new ArrayList<String>();
...
// Define the major and minor path components for the key
majorComponents.add("Smith");
// Create the retrieval key
Key myKey = Key.createKey(majorComponents);
// Now retrieve the records. Note that we do not show the creation of
// the kvstore handle here.
Iterator <KeyValueVersion>i =
kvstore.storeIterator(Direction.UNORDERED, 0,
myKey, null, null);
while (i.hasNext()) {
Value v = i.next().getValue();
// Do some work with the Value here
}