『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メソッドによって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.
}
}