ヘッダーをスキップ
Oracle TimesTen In-Memory Database Java開発者およびリファレンス・ガイド
リリース7.0
E05166-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

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

『Oracle TimesTen Replication - TimesTen to TimesTen開発者および管理者ガイド』で説明する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

*/

}

ターゲット・データ・ストアがソース・データ・ストアとは異なるマシンに存在する場合があります。更新記述子はバイト配列として返され、ネットワーク送信のためにシリアライズすることができます。

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

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

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

myTargetDataStore.apply(updateDescriptor);

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

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

myTargetDataStore.commit();

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

myTargetDataStore.rollback();

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

myTargetDataStore.close;

TargetDataStoreの詳細は、「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() ) {

    // Data store is 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.

 }

}