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