トランザクション・イベントのストリーミングの構成

Oracle NoSQL Database Streams APIを使用したストリーミング・トランザクション・イベントの構成について説明します。

オプションで、次のようにsetStreamDeliveryMode()メソッドを使用して、トランザクション・イベントをストリーミングするサブスクリプションを構成できます:

/* create subscription to stream transaction events for UserTableTxn tables */

import static oracle.kv.pubsub.NoSQLSubscriptionConfig.StreamDeliveryMode.GROUP_ALL_IN_TRANSACTION;

...
final NoSQLSubscriptionConfig subConfig =
    new NoSQLSubscriptionConfig.Builder("ChkptTable")
    .setSubscribedTables("UserTableTxn")
    .setStreamMode(NoSQLStreamMode.FROM_NOW)
    .setStreamDeliveryMode(GROUP_ALL_IN_TRANSACTION,"UserTableTxn")
    .build();
setStreamDeliveryMode()メソッドでは、引数としてStreamDeliveryModeおよび表名が必要です。
  • StreamDeliveryMode引数には、GROUP_ALL_IN_TRANSACTIONまたはSINGLE_WRITE_EVENT列挙値を指定します。トランザクション・イベントをストリーミングするには、GROUP_ALL_IN_TRANSACTIONを指定する必要があります。トランザクション・イベントを分割し、トランザクションでコミットされたすべての書込みの個別の書込み操作を配信するようにサブスクリプション・ストリームを構成する場合は、SINGLE_WRITE_EVENTを指定します。setStreamDeliveryMode()メソッドを呼び出さない場合、SINGLE_WRITE_EVENTがデフォルト・モードとみなされます。
  • 表名引数には、データ・ストアに存在する表を含める必要があります。setStreamDeliveryMode()メソッドを起動する前に、まずsetSubscribedTables()メソッドを使用して表をサブスクライブする必要があります。それ以外の場合、サブスクリプションはSubscriptionFailureException例外で失敗します。

ノート:

階層表の場合、トランザクション・イベントをストリーミングするには、サブスクリプションにルート表を追加する必要があります。同じ階層のすべての子表でも、トランザクション・イベントをストリーミングします。たとえば、トランザクション内に親表および子表に対する更新がある場合、Streams APIは、このトランザクションでコミットされたすべての書込みを単一のトランザクション・イベントとしてカプセル化し、サブスクライバにストリーミングします。トランザクション・イベントのストリーミングを構成しない場合、親表または子表へのコミットされた各書込みは、単一のストリーム・イベントとしてストリーミングされます。

トランザクション・イベントのストリーミング中に次のものを含めるようにサブスクリプションを構成することもできます。

  • ストリームで1つのサブスクライブ表のトランザクション・イベント、および別のサブスクライブ表のコミットされた書込みイベントの個別リストが配信される混合モードのストリーミング。次のコード・サンプルでは、コミットされた書込みイベントの個別のリストをストリーミングするようにUserTable表へのサブスクリプションを構成し、トランザクション・イベントを配信するようにUserTableTxn表を構成しています。
    /**
     * create subscription to stream UserTable and UserTableTxn tables
     * UserTable table streams discrete list of committed writes
     * UserTableTxn table streams transaction events
     */
    
    import static oracle.kv.pubsub.NoSQLSubscriptionConfig.StreamDeliveryMode.GROUP_ALL_IN_TRANSACTION;
    ...
    final NoSQLSubscriptionConfig subConfig =
        new NoSQLSubscriptionConfig.Builder("ChkptTable")
        .setSubscribedTables("UserTable", "UserTableTxn")
        .setStreamMode(NoSQLStreamMode.FROM_NOW)
        .setStreamDeliveryMode(GROUP_ALL_IN_TRANSACTION, "UserTableTxn")
        .build();
  • 実行中のサブスクリプションに新しいサブスクライブされた表を追加し、そのトランザクション・イベントをストリーミングします。ここでは、元の表のコミットされた書込みイベントのリストをストリーミングする既存のサブスクリプションがあるときに、別の表にサブスクライブし、そのトランザクション・イベントをストリーミングできます。次のコード・サンプルでは、まず、UserTable表の個々の書込みイベントをストリーミングするようにサブスクリプションを構成し、次に、表UserTableTxnを同じサブスクリプションにサブスクライブして、その表のトランザクション・イベントをストリーミングしています。
    /* create subscription to stream UserTable */
    final NoSQLSubscriptionConfig subConfig =
        new NoSQLSubscriptionConfig.Builder("ChkptTable")
        .setSubscribedTables("UserTable")
        .setStreamMode(NoSQLStreamMode.FROM_NOW)
        .build();
    
    /* stream all writes */
        ...
    
    /* subscribe UserTableTxn table to stream transaction events */
        subscriber.clearChangeResultFlag();
        stream.subscribeTable("UserTableTxn", true);
    
        ... 

    ノート:

    実行時に表をサブスクリプションに追加してその書込み操作をストリーミングしても、既存のサブスクリプションおよびストリーミングには影響しません。