ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com

ホーム

 
4D v19
データストア

データストア  


 

データストアとは、ORDAによって提供される、データベースを参照しそのモデルとデータにアクセスするためのインターフェースオブジェクトです。データストアはモデルデータから構成されています:

  • モデルにはデータストアを構成するすべてのデータクラスが格納され、その詳細な情報も含まれます。これはその下地にあるデータベース自体からは独立した存在です。
  • データとは、そのモデル内で使用・保存される情報を指します。例えば、従業員の名前、住所、生年月日などはデータストア内で扱うことができるデータに含まれます。

コード内で扱うにあたっては、データストアはオブジェクトであり、定義されている全データクラスをプロパティとして持ちます。データストアは単一の、ローカルあるいはリモートのデータベースを参照します。

4D では次のデータストアを扱うことができます:

  • カレント 4D データベースに基づいた、ローカルデータストア。これは、ds コマンドで返されるメインデータストアです。
  • リモートデータベースによって RESTリソースとして公開された、一つ以上のリモートデータストア。これらは、Open datastore コマンドで返されます。

注: データストア関連のメソッドやプロパティについての詳細はランゲージマニュアルの ORDA - データストア を参照ください。

4D Server アプリケーション上で公開されたデータストアは、異なるクライアントにより同時にアクセスすることができます:

  • 4D リモートアプリケーションは ORDA を使っていれば、ds コマンドでメインデータストアにアクセスできます。この 4D リモートアプリケーションは従来のモードでもデータベースにアクセスできます。これらの場合、アクセスを処理するのは4D アプリケーションサーバーです。
  • 他の 4D アプリケーション (4D リモート、4D Server) は、Open datastore コマンドを使ってリモートデータストアのセッションを開始できます。アクセスを処理するのは HTTP REST サーバーです。
  • iOS アプリケーションを更新するため、4D for iOS のクエリでアクセスできます。アクセスを処理するのは HTTP サーバーです。

ds および Open datastore コマンドを使ってデータストアを呼び出すと、戻り値のオブジェクトには、対応する 4D データベースの公開テーブルとフィールドへの参照が属性として格納されています:

  • テーブルはデータクラスへとマップされます
  • フィールドはストレージ属性へとマップされます
  • レコードはエンティティへとマップされます
  • リレーションはリレーション属性へとマップされます。ストラクチャーエディター内で定義されたリレーション名はリレーション属性名として使用されます。

変換の際には以下のルールが適用されます:

  • "RESTリソースとして公開" プロパティが設定されているテーブルとフィールドのみ利用可能です。
  • テーブル、フィールド、そしてリレーション名はオブジェクトプロパティ名へとマップされます。ORDAで"ドット記法"を使用するには、それらの名前が一般的なオブジェクト名規則に則っているようにしてください。オブジェクト名規則についてはオブジェクトプロパティ識別子 の章に説明があります。
    注: リレーションの"手動"あるいは"自動"プロパティは、ORDAに影響しません。
  • データストアは単一のプライマリーキーを持つテーブルのみを参照します(主キーを設定、削除する参照)。以下のテーブルは参照されません:
    • プライマリーキーがないテーブル
    • 複合プライマリーキーを持つテーブル
  • BLOB 型の属性はデータストア内では管理されません。BLOB 型属性はエンティティ内で Null として返され、割り当てることができません。

データベースストラクチャーレベルで変更が行われると、カレントのORDA モデルレイヤーは無効化されます。これらの変更には、以下のものが含まれます:

  • テーブル、フィールド、リレーションの追加または削除
  • テーブル、フィールド、リレーションの名称変更
  • フィールドの核となるプロパティ(型、重複不可、インデックス、自動インクリメント、null値サポートなど)の変更

カレントのORDA モデルレイヤーが無効化されたとき、そのモデルレイヤーはその後4D または4D Serverのローカルのds データストアを呼び出した時に自動的に再読み込みされ、更新されます。ただしエンティティやエンティティセレクションなど、ORDA オブジェクトへの既存の参照は、再生成されるまではそれらが作成されたときのモデルを使用し続けるという点に注意してください。

また、アップデートされたORDA モデルレイヤーは、以下のコンテキストにおいては自動的には利用可能にはなりません:

  • 4D Server に接続したリモートの4D -- リモートのアプリケーションはサーバーへと再接続する必要があります
  • (Open datastore を使用して開かれた)リモートデータストア(詳細は以下参照) -- 新しい接続を開く必要があります

Open datastore コマンドによって参照されるリモートデータストアの場合、リクエスト元プロセスとリモートデータストア間の接続はセッションにより管理されます。

 

4D アプリケーション (のプロセス) が Open datastore コマンドを使って外部のデータストアを開くと、この接続を管理するためにリモートデータストアではセッションが開始されます。このセッションは内部的にセッションID によって識別され、4D アプリケーション上では  localID と紐づいています。データ、エンティティセレクション、エンティティへのアクセスはこのセッションによって管理されます。

localID はリモートデータストアに接続しているマシンにおけるローカルな識別IDです:

  • 同じアプリケーションの別プロセスが同じリモートデータストアに接続する場合、localID とセッションは共有することができます。
  • 同じアプリケーションの別プロセスが別のlocalID を使って同じデータストアに接続した場合、リモートデータストアでは新しいセッションが開始されます。
  • 他のマシンが同じlocalID を使って同じデータストアに接続した場合、新しいセッションが新しいcookieで開始されます。

これらの原則を下図に示します。

データストアアクセスを管理しているセッションは 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 パラメーターを指定して、タイムアウトを設定することができます。

セッション終了後にリクエストがリモートデータストアに送信された場合、セッションは可能な限り (ライセンスがあり、サーバーが停止していない、など) 再開されます。ただしセッションが再開しても、ロックやトランザクションに関わるコンテキストは失われていることに留意が必要です (前述参照)。

データストアオブジェクト自身は、オブジェクトとしてコピーすることはできません:

 $mydatastore:=OB Copy(ds//null を返す

しかしながらデータストアプロパティは取得可能です:

 ARRAY TEXT($prop;0)
 OB GET PROPERTY NAMES(ds;$prop)
  //$prop には全てのデータクラスの名前が格納される

 
プロパティ 

プロダクト: 4D
テーマ: ORDA

 
ページの目次 
 
履歴 

初出: 4D v17
変更: 4D v18

 
ARTICLE USAGE

デザインリファレンス ( 4D v19)