存続時間の使用

存続時間(TTL)は、表の行を自動的に期限切れにするためのメカニズムです。TTLは、データがストアに存続できる時間として表されます。有効期限タイムアウト値に達したデータは取得できなくなり、ストア統計にも表示されません。データがストアから物理的に削除されるかどうかは、ユーザーが制御できない内部メカニズムによって決定されます。

TTLは、存続する最小保証時間を表します。データは時間または日の境界で失効します。これは、1時間のTTLでは、期限が切れていないデータが2時間分あることを意味します。たとえば、時間形式hour:minute:secondを使用して、1時間のTTLを指定した場合、データが書き込まれてから1時間以上たってから期限切れになるため、00:00:00.000から00:59:59.999の間に書き込まれたデータは02:00:00.000に期限切れとなります。

TTL値が定義されているMR表の場合、他のリージョンにレプリケートされた行は、行が書き込まれたときの有効期限を保持します。これは、デフォルトの表レベルTTL値でも、アプリケーションで設定された行レベルのオーバーライドでもかまいません。したがって、この行は、レプリケートされた時期に関係なく、すべてのリージョンで同時に期限切れになります。

期限切れのデータは、問合せおよびストア統計に表示されませんが、パージされるまでディスク領域を使用します。ここで、ストア統計とは、ストアのパフォーマンスおよび可用性に関連する統計のことです。ストアの監視を参照してください。期限切れデータは、有効期限後にディスクからパージされます。データがパージされる正確な時間は、内部のメカニズムとストア上のワークロードによって決まります。

表の行のTTL値は、有効期限値に達する前であればいつでも更新できます。期限切れのデータはTTL値を含め、変更できなくなります。

TTLは、データ削除のためにデータベース・ログ・エントリを書き込むオーバーヘッドを回避できるため、ユーザーがそのを手動で削除するよりも効率的です。また、削除はレプリケーション・ストリームには表示されません。

TTL値の指定

TTL値は、Row.setTTL()を使用して行ベースで指定します。このメソッドは、TimeToLiveクラス・インスタンスを受け入れます。このクラス・インスタンスを使用すると、行が期限切れになる前にストア内で存続する日数または時間数を識別できます。継続時間間隔を日数で指定することをお薦めします。これは、ストアで消費されるストレージの量が最も少なくなるためです。ただし、TTL値が日数の倍数でないようにする場合は、TTL値を時間数で指定します。

ストア内の表への行の書込みのコード例を拡張して、次のように5日間のTTL値を指定できます。

package kvstore.basicExample;

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

...

// KVStore handle creation is omitted for brevity

...

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

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


// Add a TTL value to the row
row.setTTL(TimeToLive.ofDays(5));

// Now put all of the cells in the row.
row.put("item", "Bolts");
row.put("description", "Hex head, stainless");
row.put("count", 5);
row.put("percentage", 0.2173913);

// Now write the table to the store.
tableH.put(row, null, null);

TTL値の更新

表の行の有効期限を更新するには、その行を通常どおり書き込み、同時に新しい有効期限を指定します。ただし、有効期限を更新することも指定する必要があります。デフォルトでは、行の新しいTTL値を指定していても、行データを変更でき、有効期限は変更されません。

有効期限を更新することを示すには、WriteOptions.setUpdateTTL()メソッドにtrueを指定します。たとえば、前述の例を使用してTTL値を10日に変更するには、次のようにします。

package kvstore.basicExample;

import oracle.kv.KVStore;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.Table.TimeToLive;
import oracle.kv.table.TableAPI;
import oracle.kv.table.WriteOptions;

...

// KVStore handle creation is omitted for brevity

...

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

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

// Change the TTL value for the row from 5 days to 10.
row.setTTL(TimeToLive.ofDays(10));

// Now put all of the cells in the row.
row.put("item", "Bolts");
row.put("description", "Hex head, stainless");
row.put("count", 5);
row.put("percentage", 0.2173913);

// Now write the table to the store.
tableH.put(row, null, new WriteOptions().setUpdateTTL(true));

TTL失効の削除

行にTTL値を設定した後で、自動的に失効させない場合は、TTL値にTimeToLive.DO_NOT_EXPIREを設定することでTTLをオフにできます。

package kvstore.basicExample;

import oracle.kv.KVStore;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.Table.TimeToLive;
import oracle.kv.table.TableAPI;
import oracle.kv.table.WriteOptions;

...

// KVStore handle creation is omitted for brevity

...

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

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


// Modify the row's TTL so that it will never expire
row.setTTL(TimeToLive.DO_NOT_EXPIRE);

// Now put all of the cells in the row.
row.put("item", "Bolts");
row.put("description", "Hex head, stainless");
row.put("count", 5);
row.put("percentage", 0.2173913);

// Now write the table to the store.
tableH.put(row, null, new WriteOptions().setUpdateTTL(true));

デフォルトの表TTL値の設定

USING TTL DDL文を使用して表を定義するときに、表にデフォルトのTTL値を設定できます。このプロパティは、CREATE TABLEを使用して表が作成されたとき、またはALTER TABLE文のいずれかを使用して表が変更されたときにオプションで適用できます。この文の詳細は、USING TTLを参照してください。

次に例を示します。

CREATE TABLE myTable (
  item STRING,
  description STRING,
  count INTEGER,
  percentage DOUBLE,
  PRIMARY KEY (item) // Every table must have a primary key
) USING TTL 5 days

プログラムの実行時に、Table.getDefaultTTL()メソッドを使用して、表に対するデフォルトのTTL値を調べることができます。