レプリケーション・メカニズムとしての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.
}
}