変更前イメージのストリーミング

Oracle NoSQL Database Streams APIを使用したアプリケーションへの変更前イメージのストリーミングについて説明します。

Oracle NoSQL Databaseでは、変更前イメージのストリーミングがサポートされています。変更前イメージを使用すると、データ・ストア内の表に対する書込み操作によって行われた変更またはデルタをアプリケーションで計算できます。

書込みの変更前イメージは、DML操作によって更新または削除される前の表の行です。デフォルトでは、Oracle NoSQL Databaseは変更前イメージを生成しません。CREATE TABLEまたはALTER TABLE DDL文を使用して変更前イメージを有効にした後、変更後イメージに加えて、サブスクライブされた表の変更前イメージを含めるようにサブスクリプションを構成できます。

表への書込み時に変更前イメージを明示的に生成し、サブスクライバにストリーミングするには、次の操作を実行する必要があります:

  1. ENABLE BEFORE IMAGE構文を使用して、表の変更前イメージを有効にします。詳細は、表作成時の変更前イメージの有効化およびALTER TABLE文のトピックを参照してください。
  2. 対象となる表のサブスクライバに変更前イメージをストリーミングするようにサブスクリプションを構成します。メソッドの詳細は、「NoSQLSubscriptionConfigの使用方法」を参照してください。
  3. 変更前イメージ・イベントを含むストリームを受信するようにサブスクライバを実装します。メソッドの詳細は、「StreamOperationクラスの使用方法」を参照してください。

次の表は、ローカルまたはマルチリージョンのユーザー表に対するDML操作の変更前イメージの内容を示しています。

表1-1 DML操作の変更前イメージ

DML操作 変更前イメージの内容
INSERT NULL
UPDATE 更新前の行
DELETE 削除された行

更新操作または削除操作の場合、変更前イメージは更新または削除される前の行です。挿入操作の場合、変更前イメージは空です。

ノート:

  1. 変更前イメージの有効化/無効化は、表ごとに行われ、表の存続期間中いつでも実行できます。
  2. 問合せおよびDDL操作では、変更前イメージは生成されません。
  3. ストリームは任意の位置から開始または再開できます(その位置が使用可能な場合)。このため、変更前イメージを有効にする前または無効にした後にイベントが作成された場合、ストリームに変更前イメージのないイベントが含まれることがあります。
  4. ストリーミングされたイベントは自己記述型です。任意のストリーム・イベントから、サブスクライバは、対応するメソッドをサブスクライバに実装することで、次のケースを区別できます:
    • イベントに対して変更前イメージが有効になっていない。
    • 変更前イメージは有効だが、期限切れである。
    • 変更前イメージは有効で、期限切れではないが、イベントに変更前イメージが適用されない。たとえば、INSERT操作の場合です。

    メソッドの詳細は、Javaダイレクト・ドライバAPIリファレンスoracle.kv.pubsub.StreamOperationクラスの概要を参照してください。

変更前イメージの期限切れとその影響

変更前イメージは変更を追跡して計算するのに有益ですが、ストレージが消費されるため、請求料金が発生する可能性があります。これを制限するには、TTL値を定義して、変更前イメージが期限切れになるようにします。変更前イメージのTTL値は、変更前イメージの生成時に設定されます。変更前イメージのTTLが期限切れになると、変更前イメージはストリームに表示されません。表の作成/変更時に変更前イメージのTTL値を定義しない場合、変更前イメージの生成から24時間後に変更前イメージが自動的に期限切れになります。表の作成時に変更前イメージのTTLを定義するには、表作成時の変更前イメージの有効化を参照してください。既存の表の変更前イメージTTLを定義するには、ALTER TABLE文を参照してください。

表には、表のTTLと変更前イメージのTTLの両方を設定できます。この2つのTTL値は相互に独立して機能します。

表が存続している間は、ALTER TABLE文を使用して、変更前イメージのTTL値を変更できます。TTL更新後に生成される変更前イメージには、新しい有効期限が反映されます。既存の変更前イメージの有効期限は影響を受けません。

たとえば、変更前イメージが5日間のTTLですでに生成されていて、変更前イメージのTTLを1日に変更した場合、TTLの更新後に新しく生成された変更前イメージは1日で期限切れになります。既存の変更前イメージの有効期限には影響しません。

行を複数回更新すると、各更新によって独自の変更前イメージが生成されます。新しい変更前イメージが生成されても、その行の古い変更前イメージの有効期限は影響を受けず、有効期限に達するまでストレージに保持されます。

たとえば、行が更新され、5日間のTTLで変更前イメージが生成されていて、その後更新された場合、2番目の更新では、2番目の更新時から5日間の有効期限を持つ新しい変更前イメージが作成されます。最初の更新によって作成された変更前イメージの有効期限には影響しません。2番目の更新からの新しい変更前イメージは、最初の更新の結果と同じ行です。

ノート:

サブスクライバが停止し、その時間内に同じ行が2回更新されると、両方の変更前イメージがそれぞれのストリーム操作で独自の有効期限内にストリーミングされます。たとえば、最初の変更前イメージは最初の更新でストリーミングされ、2番目の変更前イメージは2番目の更新でストリーミングされます。
変更前イメージのTTLの設定に関連する次の影響を考慮してください。これらのトレードオフを理解することは、変更前イメージのTTLの最適な値を見つけるために非常に有用です。
  1. 変更前イメージに小さいTTL値を設定し、サブスクライバがTTL値より長い期間停止した場合、サブスクライバがオンラインに戻る前に変更前イメージが期限切れになることがあり、ストリームから変更前イメージが失われます。
  2. 変更前イメージに大きいTTL値を設定し、同じ行が複数回更新された場合、その行に対して生成されたすべての変更前イメージは、それぞれの有効期限に達するまでストレージ内に残ります。これは、より小さい変更前イメージのTTLと比較して、追加のストレージ・オーバーヘッドが発生する可能性があります。
  3. 表のTTL値が変更前イメージのTTL値より小さい場合、行の変更前イメージがまだアクティブである間に、データ行が期限切れになる可能性があります。このような場合、Streams APIは、期限切れになるまで変更前イメージをストリーミングできます。