【问题标题】:What does it mean by $scope=global in ATG..?ATG 中的 $scope=global 是什么意思..?
【发布时间】:2013-09-07 22:50:32
【问题描述】:
根据文档,
全局:组件在所有用户之间共享。
会话:向每个用户提供组件的单独实例。
这是否意味着,对于全局组件,整个核心系统只有一个实例..
如果这是真的,它对像“/atg/dynamo/transaction/TransactionManager”这样的组件和大多数液滴......如何有效?
因为这些组件同时被多个用户使用
已编辑:
我了解“TransactionManager”的行为。根据定义应该有一个事务管理器,并且他应该为每个事务保留事务对象。
但是我的问题对于像 foreach、switch 等这样的液滴仍然有效(其中大多数是全局范围的)
如果整个核系统只有一个对应类的实例,是不是对性能有不好的影响?
【问题讨论】:
标签:
scope
components
atg
atg-dynamo
【解决方案1】:
ATG Commerce 有 4 种不同范围的组件
- 全局:如果未定义范围,这是组件的默认范围。
这些组件将被初始化一次,并将作为
全局对象。拥有所有 Droplet、工具、
全局管理器和其他配置组件
- 会话:维护的范围和值对于每个
会议。通常使用的会话范围组件是 ShoppingCart
(Order)、Profile、SearchFormHandler 等。
- 请求:维护的范围和值对于每个请求都是唯一的。通常使用的请求范围组件是处理单个请求的 FormHandler。
- 窗口:范围和维护的值将是唯一的,直到
浏览器窗口关闭。 Window 范围组件
通常用于 ShoppingCart 组件等的 CSC 应用程序中。
基于业务使用任何范围的组件都很好
要求,但将其声明为 Global 并使用它将是
有利于提高应用程序的性能。
这是一个经验法则,将业务逻辑放在全局范围组件中,并在需要时从较低范围的组件中引用它。
这将减少等待垃圾收集的线程。
【解决方案2】:
如果您了解设计模式,则 $scope=global 相当于将 ATG 组件设置为单例。
【解决方案3】:
从历史上看,ATG 提供了三种不同类型的示波器。现在增加到 5 个,增加了 Window(一般只在 CSC 应用程序中使用,所以尽量不要使用它)和 Prototype(添加以支持使用 Endeca Cartridge Handlers)。
正如您从文档中强调的那样,全局组件被实例化一次并由所有用户共享,而会话组件为给定会话创建一次并由该会话的所有请求共享。同样,对于使用它的每个请求,都会重新实例化请求范围的组件。
从性能的角度来看,解析到现有组件(例如 ForEach 等全局范围的组件)的路径需要一点时间,但实例化一个新对象(即请求范围的组件)是比较贵。
所以在ForEach droplet 的情况下,它会被实例化一次,但在service 方法中,它实际上是从请求中提取参数:
String elementName = pRequest.getParameter(ELEMENT_NAME);
这意味着你的全局范围的组件是线程安全的,因为它只接受来自当前请求的参数。所以一般来说,如果一个组件可以由多个用户共享,而不用担心同步,它应该是全局范围的,而不是会话或请求范围的。 (经验法则应该是,如果您的 droplet 是请求范围的,那么您可能做错了)。