1

セッション レプリケーションが有効になっている同じマシンで実行されている 2 つのクラスター化されたインスタンスなど、coldfusion9 のマルチサーバー インストールを使用する場合、セッション スコープに格納されているアレイがサーバー インスタンス間で複製されるかどうかを知りたいです。

ドキュメントを正しく理解したかどうかわかりません:

http://help.adobe.com/en_US/ColdFusion/9.0/Admin/WSc3ff6d0ea77859461172e0811cbf363c31-7ffa.html

それは言います:

また、セッション レプリケーションは、そのセッション スコープ変数がクラスター全体でレプリケートされることを保証します。ただし、セッション レプリケーションは、セッション スコープ CFC または変数内の配列のレプリケーションをサポートしていません。

たとえば、構造体の配列 (数量とアイテム ID を含む) である「カート」と呼ばれるセッション変数にショッピングカートを格納するショッピング システムがある場合、これはクラスター メンバー インスタンス全体で複製されませんか?

4

1 に答える 1

1

ショッピング カート自体が CFC の場合:

<cfset session.cart = CreateObject('component','model.objects.shoppingCart') />

構造体の配列を内部でラップし、それらを SESSION または VARIABLES に格納すると、機能しません。それ以外の場合は発生しますが、ACF9.0 マルチサーバー クラスタに実装されている場合は発生しません。

解決策は、ストアの CFC/クラスを次のように再設計することです。

  1. 内部的に (CFC 内で)、配列へのアクセスを格納するために VARIABLES スコープを使用しないでください。

  2. 内部的に (CFC 内で)、配列の読み取り/書き込み時に SESSION スコープに直接アクセスしないでください。

これを行うには、配列の代わりに構造体を使用します(以下は、ショッピング カート CFC 内で宣言されたメソッドです)。

<cffunction name="addItemToCart" returntype="void">
  <cfargument name="item" type="any" required="true" />

  <cfscript>
  var id = arguments.item.getID();
  if (NOT StructKeyExists(VARIABLES.userCart, 'id')
  {
     VARIABLES.userCart[id] = StructNew();
     VARIABLES.userCart[id].qty = 0;
  }
  VARIABLES.userCart[id].item = arguments.item;
  VARIABLES.userCart[id].qty++;
  </cfscript>

上記の疑似コードの例では、VARIABLES.userCart は、CFC の範囲内でアクセス可能なスコープであり (CFC の存続期間中、そのメソッド呼び出し全体で共有されます)、userCart 変数を配列ではなく構造体として格納しています。 . 次に、ショッピング カート アイテムの一意の ID に基づいて新しいキーを構造体に追加し、サブ構造体を作成します。 /数量を更新します(「qty」キー内)。

SESSION で CFC をインスタンス化/保存することにした場合、配列ではなく構造体をストレージ メカニズムとして使用すると、マルチサーバー クラスターでサポートされる CF9 アプリを構築できます。

要約すると、次のようになります。

<cfset SESSION.myCartItemCount = ArrayNew(1) />

サポートされています。

<cfset SESSION.user = CreateObject('component','model.objects.user') />

CFC 内に配列ストレージがない場合はサポートされます。

<cfset SESSION.cart = CreateObject('component','model.objects.cart') />

配列への内部読み取り/書き込みがある場合は、サポートされていません。

内部で配列を構造体に変更すれば、準備完了です。

于 2011-12-18T22:26:46.057 に答える