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

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

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

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

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

  • version

    読取りで一致する必要のあるVersion。返される値は、ポリシーで指定されたバージョン以上です。

  • timeout

    version要件を満たすためにレプリカが待機できる時間を表すlong。つまり、レプリカがversion要件をすぐには満たさない場合、マスターからの必要なデータで更新されるかどうかをこの時間の間待ちます。レプリカがtimeout期間内に要件を満たさない場合、ConsistencyExceptionがスローされます。

  • timeoutUnit

    timeoutで使用される単位を表すTimeUnit。たとえば、TimeUnit.SECONDSです。

たとえば、次のコードでは、ストア書込みを行い、バージョン情報を収集して、バージョンベースの一貫性ポリシーの作成に使用します。

package kvstore.basicExample;

import oracle.kv.KVStore;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;
import oracle.kv.Version;

...

// KVStore handle creation is omitted for brevity

...

TableAPI tableH = kvstore.getTableAPI();
Table myTable = tableH.getTable("myTable");

// Get a Row instance
Row row = myTable.createRow();

// Now put all of the cells in the row.

row.put("item", "Bolts");
row.put("count1", 5);
row.put("count2", 23);
row.put("percentage", 0.2173913);

// Now write the table to the store, capturing the
// Version information as we do.

Version matchVersion = tableH.put(row, null, null);

Version matchVersion = kvstore.put(myKey, myValue); 

このアプリケーション・コードの別の箇所、あるいはまったく別のアプリケーションで、上で取得したmatchVersionを使用してバージョンベースの一貫性ポリシーを作成します。

package kvstore.basicExample;

import oracle.kv.Consistency;
import oracle.kv.ConsistencyException;
import oracle.kv.KVStore;
import oracle.kv.table.PrimaryKey;
import oracle.kv.table.ReadOptions;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;

import java.util.concurrent.TimeUnit;

...

// KVStore handle creation is omitted for brevity

...

// Construct the PrimaryKey.

PrimaryKey key = myTable.createPrimaryKey();
key.put("item", "Bolts");

// Create the consistency policy, using the 
// Version object we captured, above.
Consistency.Version versionConsistency = 
        new Consistency.Version(matchVersion,
                                200,
                                TimeUnit.NANOSECONDS);

// Create a ReadOptions using our new consistency policy.
ReadOptions ro = new ReadOptions(versionConsistency, 0, null);

// Now perform the read.
try {

    Row row = tableH.get(key, ro);

    // Do work with the row here
} catch (ConsistencyException ce) {
    // The consistency guarantee was not met
}