リモートデータストアの利用
4D アプリケーション上で公開された データストア は、異なるクライアントにより同時にアクセスすることができます:
- 4D リモートアプリケーションは ORDA を使っていれば、
ds
コマンドでメインデータストアにアクセスできます。 この 4D リモートアプリケーションは従来のモードでもデータベースにアクセスできます。 これらのアクセスを処理するのは 4Dアプリケーションサーバー です。 - 他の 4Dアプリケーション (4Dリモート、4D Server) は、
Open datastore
コマンドを使ってリモートデータストアのセッションを開始できます。 アクセスを処理するのは HTTP REST サーバー です。 - iOS アプリケーションを更新するため、4D for iOS のクエリでアクセスできます。 アクセスを処理するのは HTTP サーバー です。
Open datastore
コマンドによって参照されるリモートデータストアの場合、リクエスト元プロセスとリモートデータストア間の接続はセッションにより管理されます。
セッションの開始
4Dアプリケーション (のプロセス) が Open datastore
コマンドを使って外部のデータストアを開くと、この接続を管理するためにリモートデータストアではセッションが開始されます。 このセッションは内部的にセッションID によって識別され、4Dアプリケーション上では localID
と紐づいています。 データ、エンティティセレクション、エンティティへのアクセスはこのセッションによって自動的に管理されます。
localID
はリモートデータストアに接続しているマシンにおけるローカルな識別IDです:
- 同じアプリケーションの別プロセスが同じリモートデータストアに接続する場合、
localID
とセッションは共有することができます。 - 同じアプリケーションの別プロセスが別の
localID
を使って同じデータストアに接続した場合、リモートデータストアでは新しいセッションが開始されます。 - 他のマシンが同じ
localID
を使って同じデータストアに接続した場合、新しいセッションが新しい cookie で開始されます。
これらの原則を下図に示します:
REST リクエストによって開かれたセッションについては、ユーザーとセッション を参照ください。
セッションの監視
データストアアクセスを管理しているセッションは 4D Server の管理ウィンドウに表示されます:
- プロセス名: "REST Handler: <process name>"
- タイプ: HTTP Server Worker
- セッション:
Open datastore
コマンドに渡されたユーザー名
次の例では、1つのセッション上で 2つのプロセスが実行中です:
ロッキングとトランザクション
エンティティロッキングやトランザクションに関連した ORDA 機能は、ORDA のクライアント / サーバーモードと同様に、リモートデータストアにおいてもプロセスレベルで管理されます:
- あるプロセスがリモートデータストアのエンティティをロックした場合、セッションの共有如何に関わらず、他のすべてのプロセスに対してそのエンティティはロックされた状態です (エンティティロッキング 参照)。 同一のレコードに対応する複数のエンティティが 1つのプロセスによってロックされている場合、同プロセス内でそれらがすべてアンロックされないと、ロックは解除されません。 なお、ロックされたエンティティに対する参照がメモリ上に存在しなくなった場合にも、ロックは解除されます。
- トランザクションは
dataStore.startTransaction( )
、dataStore.cancelTransaction( )
、dataStore.validateTransaction( )
のメソッドを使って、リモートデータストアごとに個別に開始・認証・キャンセルすることができます。 これらの操作は他のデータストアには影響しません。 - 従来の 4Dランゲージコマンド (
START TRANSACTION
,VALIDATE TRANSACTION
,CANCEL TRANSACTION
) はds
で返されるメインデータストアに対してのみ動作します。 リモートデータストアのエンティティがあるプロセスのトランザクションで使われている場合、セッションの共有如何に関わらず、他のすべてのプロセスはそのエンティティを更新できません。 - 次の場合にエンティティのロックは解除され、トランザクションはキャンセルされます:
- プロセスが強制終了された
- サーバー上でセッションが閉じられた
- サーバー管理ウィンドウからセッションが強制終了された
セッションの終了
アクティビティなしにタイムアウト時間が経過すると、4D は自動的にセッションを終了します。 デフォルトのタイムアウト時間は 60分です。Open datastore
コマンドの connectionInfo
パラメーターを指定して、タイムアウト時間を変更することができます。
セッション終了後にリクエストがリモートデータストアに送信された場合、セッションは可能な限り (ライセンスがあり、サーバーが停止していない、など) 再開されます。 ただしセッションが再開しても、ロックやトランザクションに関わるコンテキストは失われていることに留意が必要です (前述参照)。