セッション・シングルトンの紹介

Deeplからの自動翻訳

シングルトンは、4D 20 R5の目玉機能のひとつです。以前は、開発者は2種類のシングルトンを利用することができました:

  • プロセス・シングルトンは、各プロセスに固有ですが、プロセス間で異なります、
  • と、アプリケーション全体でユニークな共有シングルトンです。

4D 20 R7では新しいタイプのシングルトン、セッション・シングルトンをリリースします

HDIセッション・シングルトン

セッション・シングルトンとは?

セッション・シングルトンは、セッション全体で共有されますが、セッション間で異なります。セッション・シングルートンは、セッション全体で共有されますが、 セッション間では変化します。セッション・シングルートンは、一人のユーザーのリクエストが毎回異なるプロセスで処理されるようなウェブ環境で特に有用です。クライアントサーバー環境では、セッションシングルトンは、サーバー上でユーザーごとに1つのシングルトンを作成することを簡素化し、どのプロセスがそれを使用しているかという心配をなくします。

4Dのセッション

4Dには4種類のセッションがあります:

  1. クライアントサーバーセッションは、新しいユーザーが4Dリモートに接続するたびに4Dサーバー上に作成されます。
  2. ウェブセッションは、ユーザーのHTTPリクエストを処理するためにウェブサーバーによって作成されます。
  3. RESTセッションは、ユーザーのRESTリクエストを処理するためにRESTサーバーによって作成されます。
  4. ストアドプロシージャセッションは、すべてのストアドプロシージャの実行を処理する4Dサーバーのセッションです。

第5のエッジケースは、セッションが全く存在しない場合に発生します。これは、4D Monoを実行し、Web/RESTリクエストの外部でコードを実行した場合にのみ発生します。

典型的なユースケース:アイテムのインベントリ

セッションのシングルトンは、ショッピングカートや要素のリスト、つまり商品在庫のようなユースケースで輝きます。例えば、各ユーザのインベントリが一意であるようなアイテムインベントリを考えてみましょう:

//class ItemInventory
    property itemList : Collection:=[]

session singleton Class constructor()

shared function addItem($item:object)
    This.itemList.push($item)

ItemInventoryクラスをセッションシングルートンとして定義することで、全てのセッションひいては全てのユーザが独自のItemInventoryを持つことになります。ユーザのItemInventoryにアクセスするのは、他のシングルトンと同様に簡単です:

$myItemInventory:=cs.ItemInventory.me

これは、アプリケーションのどこからでも現在のセッションのItemInventoryを返す。このItemInventoryを、例えばアイテムを追加したり削除したりして変更すると、現在のセッションのつまり現在のユーザのItemInventoryのみが変更されます。

セッションのシングルトンに関する主な考慮事項

共有クラス:

最も重要なことは、セッション・シングレットンは複数のプロセスで使用されるため、共有クラスであることを理解することです。

共有セッション:

共有セッション(Shared sessions):最後になりましたが、決して重要ではありません:ウェブ接続と REST 接続で同じクッキーを再利用する場合、同じセッション(ウェブセッションから REST セッションに切り替わる)にアクセスすることになり、同じセッションシングレットンになります。

結論

まとめると、セッションシングルトンは、4Dの異なるセッション間でユーザー固有のデータを管理するためのシンプルで効率的な方法を提供します。この新機能は、セッション間のデータを効率的に管理するアプリケーションを構築するための、簡単でスケーラブルなソリューションを提供します。

質問があったり、サポートが必要な場合は、4Dフォーラムで議論に参加してください

Nicolas Brachfogel
- プロダクトオーナー & シニアデベロッパー - Nicolas Brachfogelは、2017年にシニアデベロッパーとして4Dに入社しました(4D Serverとネットワークを担当)。Apple Siliconのリリースを管理するプロダクトオーナーとして、ユーザーストーリーを書いて機能仕様に落とし込み、機能実装が顧客のニーズを満たしているかを確認する役割を担っています。Institut Supérieur d'Informatique Appliquée (INSIA) を卒業した Nicolas は、2001年にソフトウェア開発者としてのキャリアをスタートさせました。JavaとC++で数年間コーディングした後、ゲーム会社のクライアント・サーバー開発を専門に担当。サーバー開発者/アーキテクトとして、多くのゲーム(Dofus Arena、Drakerz、Trivial Pursuit Go!)のサーバーアーキテクチャに携わり、成功を収めてきました。