バージョンベースの一貫性の使用

バージョンベースの一貫性は、各操作ベースで使用されます。レプリカで行われる読取りが、少なくとも、マスターで以前に行われた書込み程度に最新であることが保証されます。

これが使用される例として、顧客の情報(名前など)を収集するWebアプリケーションがあります。顧客に表示される後続のページをすべて名前でカスタマイズします。顧客の名前の格納は、マスター・ノードでのみ行われる書込み操作です。一方、後続のページの作成は、ストア内のどのノードでも行うことができる読取り専用操作として実行されます。

この一貫性ポリシーを使用するには、アプリケーション内のプロセス間でバージョン情報が転送される必要があります。

バージョンベースの一貫性ポリシーを作成するには、Consistency.Versionクラスを使用します。このクラスのインスタンスを作成する場合、次の情報を指定する必要があります。

たとえば、次のサンプル・コードでは、書込みを行い、バージョン情報を収集して、バージョンベースの一貫性ポリシーの作成に使用します。この例では、汎用の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
}