この付録では、オブジェクト同期化機能について説明します。この機能を使用すると、“不定期的に接続される”システム上のデータベースにある特定のテーブルを同期できます。
オブジェクトの同期化の概要
オブジェクトの同期化は、InterSystems IRIS® オブジェクトに使用できるツールのセットです。オブジェクトの同期化により、アプリケーション開発者は、“不定期に接続される” システム上のデータベースを同期化するためのメカニズムをセット アップできます。このプロセスを経て、各データベースのオブジェクトが更新されます。オブジェクトの同期化によって、高可用性を提供する InterSystems IRIS システム・ツールに機能が補足されます。これは、リアルタイムの更新をサポートするためのものではなく、不定期に更新する必要があるシステムで最も役立つ機能です。
例えば、中央のサーバにデータベースのマスタ・コピーがあり、クライアント・マシンにセカンダリ・コピーがある環境に、オブジェクトの同期化の標準アプリケーションがあるとします。各営業員がノート・パソコンに該当のデータベースのコピーを持っている営業用データベースの場合を考えてみましょう。営業員の Mary は、ネットワークに接続していないとき、データベースの自分用のコピーを更新します。彼女が自分のコンピュータをネットワークに接続すると、中央とリモートのデータベースのコピーが同期化されます。これは、時間単位、1 日単位、あるいは任意の間隔で実行できます。
2 つのデータベース間でオブジェクトを同期化するには、それぞれのデータベースをもう一方のデータベースのデータで更新する必要があります。しかし、InterSystems IRIS では、このような双方向での同期はサポートされていません。正確には、一方のデータベースの更新がもう一方のデータベースに送信された後、後者のデータベースの更新が前者のデータベースに送信されます。標準アプリケーションでは、(前述の営業データベースの例のように) 1 つのメイン・データベースと 1 つ以上のローカル・データベースがある場合、更新はまずローカル・データベースからメイン・データベースに送信され、次に、メイン・データベースからローカル・データベースに送信されるようにすることをお勧めします。
オブジェクトの同期化の場合、クライアントとサーバの概念は、慣例に従うという理由のみで存在します。任意の 2 つのデータベースでは、双方向の更新が可能です。2 つ以上のデータベースがある場合、すべてのデータベース (メイン・データベースと個別に同期化するローカル・データベースなど) の更新に使用する方法を選択できます。
この章では、以下の項目について説明します。
GUID
更新が正確に実行されるには、データベースの各オブジェクトを一意に区別できる必要があります。この機能のために、InterSystems IRIS では、各オブジェクト・インスタンスに GUID (Globally Unique ID) を割り当てます。この GUID によって各オブジェクトは例外なく一意に区別可能になります。
GUID は、GUIDENABLED パラメータ値に基づいてオプションで作成されます。GUIDENABLED の値が 1 である場合は、新しい各オブジェクト・インスタンスに GUID が割り当てられます。
以下の例を考えてみます。2 つのデータベースが同期化されて、それぞれのデータベースに同じオブジェクトのセットがあるとします。同期化の後、各データベースに新しいオブジェクトが 1 つ追加されています。オブジェクトの同期化では、この 2 つのオブジェクトが共通の GUID を共有している場合、これらのオブジェクトは状態が異なる同一のオブジェクトと見なされます。各オブジェクトに固有の GUID が割り当てられている場合、これらのオブジェクトは異なるオブジェクトと見なされます。
更新の機能
1 つのデータベースから別のデータベースへの各更新は、トランザクションのセットとして送信されます。これにより、相互依存するオブジェクトすべてが一緒に更新されます。各トランザクションの内容は、“ソース” データベースのジャーナルの内容によって異なります。更新には、最後の同期化以降に発生したすべてのトランザクションを限度として、1 つ以上のトランザクションを含めることができます。
以下の状況はアプリケーションで解決します。
SyncSet および SyncTime オブジェクト
2 つのデータベースを同期化するときは、それぞれが、他方のデータベースにはないトランザクションを含んでいます。以下はその図です。
2 つの同期化されていないデータベース
データベース A とデータベース B は、データベース A のトランザクション 536 とデータベース B のトランザクション 112 で同期化されています。各データベースの後続のトランザクションは、他方のデータベースで更新される必要があります。これを行うために、InterSystems IRIS では SyncSet オブジェクトが使用されます。このオブジェクトには、データベースの更新に使用するトランザクションのリストが含まれています。例えば、データベース A からデータベース B に同期化する場合、SyncSet オブジェクトの既定の内容はトランザクション 547、555、562、および 569 です。同様に、データベース B からデータベース A に同期化する場合、SyncSet オブジェクトの既定の内容は、117、124、130、および 136 です (トランザクションでは連続した番号は使用されません。これは、各トランザクションに複数の挿入、更新、および削除がカプセル化されており、そのそれぞれがその間の番号を使用するためです)。
各データベースには、他方のデータベースとの同期化の履歴があります。このレコードを SyncTime テーブルと呼びます。データベースの場合、次の形式になっています。
Database Namespace Last Transaction Sent Last Transaction Received
------------------------------------------------------------------------------
B User 536 112
Note:
各トランザクションと対応している番号はタイム・スタンプではありません。個々のデータベース内でトランザクションを報告した順序を示しています。
データベース A からデータベース B への同期化が完了すると、2 つのデータベースは次のようになります。
一方のデータベースが他方のデータベースと同期化された後の 2 つのデータベース
トランザクションがデータベース B に追加されるため、そのデータベースで新しいトランザクション番号が付けられます。
同様に、データベース B からデータベース A への同期化によって、データベース A に 117、124、130、および 136 が追加され、新しいトランザクション番号が付きます。
2 つの同期化されたデータベース
データベース A が発端になるデータベース B のトランザクション (140 ~ 162) により、データベース A が更新されることはありません。これは、B から A への更新には、同期化機能の一部である特別な機能が使用されるためです。これは、以下のように実行されます。
-
データベース内の各トランザクションには、“元のデータベース” を示すラベルが付けられます。この例では、データベース B のトランザクション 140 にはデータベース A が元のデータベースであることを示すマークが付けられ、トランザクション 136 にはデータベース B が元のデータベースであることを示すマークが付けられています。
-
同期化のための一連のトランザクションを 1 つにまとめた SyncSet.AddTransactions() メソッドでは、特定のデータベースが元となっているトランザクションを除外できます。したがって、B から A に更新する場合、データベース A が元になっているすべてのトランザクションは、既にデータベース B のトランザクション・リストに追加されているために、AddTransactions() によって除外されます。
この機能によって、2 つのデータベースが、互いに同じセットのトランザクションを更新し続けるという無限ループを防止できます。