バージョンベースの一貫性は、各操作ベースで使用されます。レプリカで行われる読取りが、少なくとも、マスターで以前に行われた書込み程度に最新であることが保証されます。
これが使用される例として、顧客の情報(名前など)を収集するWebアプリケーションがあります。顧客に表示される後続のページをすべて名前でカスタマイズします。顧客の名前の格納は、マスター・ノードでのみ行われる書込み操作です。一方、後続のページの作成は、ストア内のどのノードでも行うことができる読取り専用操作として実行されます。
この一貫性ポリシーを使用するには、アプリケーション内のプロセス間でバージョン情報が転送される必要があります。
バージョンベースの一貫性ポリシーを作成するには、Consistency.Version
クラスを使用します。このクラスのインスタンスを作成する場合、次の情報を指定する必要があります。
version
読取りで一致する必要のあるVersion
。
timeout
version
要件を満たすためにレプリカが待機できる時間を表すlong
。つまり、レプリカがversion
要件をすぐには満たさない場合、マスターからの必要なデータで更新されるかどうかをこの時間の間待ちます。レプリカがtimeout
期間内に要件を満たさない場合、ConsistencyException
がスローされます。
timeoutUnit
timeout
で使用される単位を表すTimeUnit
。たとえば、TimeUnit.SECONDS
です。
たとえば、次のサンプル・コードでは、書込みを行い、バージョン情報を収集して、バージョンベースの一貫性ポリシーの作成に使用します。この例では、汎用のAvroバインディングを使用して、人の情報を格納することを想定しています。
package kvstore.basicExample; ... import oracle.kv.Key; import oracle.kv.Value; import oracle.kv.Version; import java.util.ArrayList; import org.apache.avro.Schema; import oracle.kv.avro.GenericAvroBinding; import oracle.kv.avro.GenericRecord; ... ArrayList<String> majorComponents = new ArrayList<String>(); ... // Define the major path components for the key majorComponents.add("Smith"); majorComponents.add("Bob"); // Create the key Key myKey = Key.createKey(majorComponents); ... // Binding and schema creation omitted ... final GenericRecord person = new GenericData.Record(personSchema); person.put("ID", 100011); person.put("FamiliarName", "Bob"); person.put("Surname", "Smith"); person.put("PrimaryPhone", "408 555 5555"); Value myValue = binding.toValue(person); // Now put the record. Note that we do not show the creation of the // kvstore handle here. Version matchVersion = kvstore.put(myKey, myValue);
このアプリケーション・コードの別の箇所、あるいはまったく別のアプリケーションで、上で取得したmatchVersion
を使用してバージョンベースの一貫性ポリシーを作成します。
package kvstore.basicExample; ... import oracle.kv.Consistency; import oracle.kv.ConsistencyException; import oracle.kv.Key; import oracle.kv.Value; import oracle.kv.ValueVersion; import oracle.kv.Version; import org.apache.avro.Schema; import oracle.kv.avro.GenericAvroBinding; import oracle.kv.avro.GenericRecord; import java.util.ArrayList; import java.util.concurrent.TimeUnit; ... ArrayList<String> majorComponents = new ArrayList<String>(); ... // Define the major path components for the key majorComponents.add("Smith"); majorComponents.add("Bob"); // Create the key Key myKey = Key.createKey(majorComponents); // Create the consistency policy Consistency.Version versionConsistency = new Consistency.Version(matchVersion, 200, TimeUnit.NANOSECONDS); // Now retrieve the record. Note that we do not show the creation of // the kvstore handle here. try { ValueVersion vv = kvstore.get(myKey, versionConsistency, 0, // Timeout parameter. // 0 means use the default. null); // Timeout units. Null because // the Timeout is 0. // Deserialize with our generic avro binding // (creation of this binding is not shown). final GenericRecord member = binding.toObject(vv.getValue()); // Do work with the generic record here. } catch (ConsistencyException ce) { // The consistency guarantee was not met }