1

我很想知道在使用coldfusion9的多服务器安装时存储在会话范围内的数组是否在服务器实例中被复制,例如在同一台机器上运行2个集群实例并启用会话复制。

我不知道我是否正确理解了文档:

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

它说:

会话复制还确​​保跨集群复制会话范围变量。但是,会话复制不支持在会话范围 CFC 或变量中复制数组。

因此,例如,如果我有一个购物系统,它将购物车存储在一个名为“cart”的会话变量中,它是一个结构数组(带有数量和项目 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 向结构中添加新的键,并创建一个子结构:一个用于保存实际商店项目(在“item”键中),一个用于保存/更新数量(在“数量”键中)。

如果您决定在 SESSION 中实例化/存储 CFC,则使用结构而不是数组作为存储机制将允许您构建多服务器集群中支持的 CF9 应用程序。

所以,总结一下:

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

支持的。

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

支持,如果CFC 内没有 Array 存储。

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

不支持,如果有对数组的内部读/写。

将数组更改为引擎盖下的结构,您就可以开始了。

于 2011-12-18T22:26:46.057 回答