レプリケーション・メカニズムとしてのJMS/XLA

TimesTenレプリケーションでは必要に満たない場合は、かわりにJMS/XLAを使用できます。

レプリケーション・メカニズムとしてのJMS/XLAの使用について

TimesTenレプリケーションはお客様のほとんどのニーズに対応しています。ただし、JMS/XLAを使用してデータベース間で更新をレプリケートすることもできます。

この方法で独自のレプリケーション・スキームをJMS/XLAに加え実装することはかなり複雑ですが、なんらかの理由でTimesTenでのレプリケーションが実現不能な場合は検討できます。

TimesTenレプリケーションについては、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』TimesTenレプリケーションの概要を参照してください。

ターゲット・データベースへのJMS/XLAメッセージの適用

ソース・データベースでJMS/XLAメッセージが作成されます。このメッセージをターゲット・データベースに適用するには、メッセージからXLA記述子を抽出する必要があります。

MapMessageインタフェースを使用して更新記述子を抽出します。

MapMessage message;
/*
 *...other code
 */
try {
  byte[]updateMessage=
    mapMessage.getBytes(XlaConstants.UPDATE_DESCRIPTOR_FIELD);
}
catch (JMSException jex){
/*
 *...other code
 */
}

ターゲット・データベースは、ソース・データベースとは別のシステムにインストールできます。更新記述子はバイト配列として返され、ネットワーク送信のためにシリアライズすることができます。

ソース・データベースからのオブジェクトを適用するために、ターゲット・データベースを表すターゲット・データベース・オブジェクトを作成する必要があります。TargetDataStoreImplクラスのインスタンスとして、myTargetDataStoreというターゲット・データベース・オブジェクトを作成します。例:

TargetDataStore myTargetDataStore=
   new TargetDataStoreImpl("DSN=sampledb");

TargetDataStoreメソッドapply()を使用して、myTargetDataStoreにメッセージを適用します。例:

myTargetDataStore.apply(updateDescriptor);

デフォルトでは、TimesTenは、更新を適用する前にターゲット・データベース上の競合を確認します。ターゲット・データベースに更新よりも遅い情報が含まれる場合、TargetDataStoreでは例外がスローされます。TimesTenで競合を確認しない場合は、TargetDataStoreメソッドsetUpdateConflictCheckFlag()を使用して動作を変更します。

デフォルトでは、TimesTenは、更新記述子に含まれているコミット・フラグとトランザクション境界に基づいてデータベースに対する更新をコミットします。アプリケーションで手動コミットを実行する場合は、setAutoCommitFlag()メソッドを使用して自動コミット・フラグを変更します。myTargetDataStoreに対して手動コミットを実行するには、次のコマンドを使用します。

myTargetDataStore.commit();

更新アプリケーションでエラーが発生した場合は、ロールバックを実行できます。myTargetDataStoreに対して次のコマンドを使用します。

myTargetDataStore.rollback();

次のコマンドを使用して、myTargetDataStoreをクローズします。

myTargetDataStore.close();

「JMS/XLAレプリケーションAPI」を参照してください。

TargetDataStoreのエラーのリカバリ

TargetDataStoreを起動すると、一時的なエラーと永続的なエラーが発生する可能性があります。

この項では、エラー・リカバリについて説明します。

一時的なエラーが発生すると、TargetDataStoreメソッドによって0(ゼロ)以外の値が返されます。アプリケーションは処理を再試行することができ、再適用する必要がある更新記述子を監視します。一時的なXLAエラーの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』XLAのエラーの処理を参照してください。

永続的なエラーに対しては、TargetDataStoreメソッドによってJMSExceptionオブジェクトが返されます。アプリケーションが永続的なエラーを受信すると、データベースが有効かどうかを確認する必要があります。データベースが無効な場合、ターゲット・データベース・オブジェクトを閉じ、新しいものを作成する必要があります。その他のタイプの永続的なエラーには、手動での操作が必要になる場合があります。

次の例に、TargetDataStoreオブジェクトからエラーをリカバリする方法を示します。

TargetDataStore theTargetDataStore;
byte[] updateDescriptor;
int rc;

// Other code
try {
  ...
  if ( (rc = theTargetDataStore.apply(updateDescriptor) ) == 0 ) {
    // Apply successful.
  }
  else {
    // Transient error. Retry later.
  }
 }
catch (JMSException jex) {
  if (theTargetDataStore.isDataStoreValid() ) {
    // Database valid; permanent error that may need Administrator intervention.
  }
  else {
    try {
      theTargetDataStore.close();
  }
  catch (JMSException closeEx) {
    // Close errors are not usual. This may need Administrator intervention.
  }
}