在ATG中,$ scope = global是什么意思?

时间:2013-09-04 12:21:05

标签: scope components atg atg-dynamo

根据文件,

  

全局:组件在所有用户之间共享。   会话:为每个用户提供组件的单独实例

这意味着,对于全局组件,整个核系统只有一个实例。 如果这是真的,那对于像'/ atg / dynamo / transaction / TransactionManager'这样的组件以及大多数飞沫来说它是如何有效的? 因为这些组件在一个时刻被多个用户使用

编辑:

我理解'TransactionManager'的行为。根据定义,应该有单个事务管理器,并且他应该为每个事务保留事务对象。 但我的问题仍然适用于像foreach,switch等小滴(大多数都是全局范围的) 如果整个核系统只有一个相应类的实例,那么它对性能有不良影响吗?

3 个答案:

答案 0 :(得分:6)

历史上,ATG有三种不同类型的范围。现在已经增加到5,增加了Window(通常只在CSC应用程序中使用,所以尽量不要使用它)和Prototype(添加以支持使用Endeca Cartridge处理程序)。

正如您在文档中强调的那样,全局组件实例化一次并由所有用户共享,而会话组件为给定会话创建一次,并由该会话的所有请求共享。类似地,对于使用它的每个请求,新近实例化了请求范围组件。

从性能的角度来看,解析现有组件的路径(例如像ForEach这样的全局范围组件)需要一点时间,但是实例化一个新对象(换句话说是一个请求范围的组件)是相对更贵。

因此,对于ForEach droplet,它会被实例化一次,但在service方法中,它实际上会从请求中提取参数:

String elementName = pRequest.getParameter(ELEMENT_NAME);

这意味着您的全局范围组件是线程安全的,因为它只接受当前请求中的参数。因此,一般而言,如果一个组件可以由多个用户共享,而不必担心同步,那么它应该是全局范围的,而不是会话或请求作用域。 (经验法则应该是,如果您的Droplet是请求作用域,您可能做错了)。

答案 1 :(得分:1)

如果您了解设计模式,$ scope = global相当于将ATG组件设为单例。

答案 2 :(得分:1)

ATG Commerce有4种不同的组件范围

  1. 全局:如果未定义范围,则这是组件的默认范围。 这些组件将初始化一次,并将作为一个 全球对象。拥有所有Droplets,Tools, 管理器和其他配置组件为全局
  2. 会话:维护的范围和值对每个人都是唯一的 会话。通常使用的会话范围组件是ShoppingCart (订单),Profile,SearchFormHandler等..
  3. 请求:维护的范围和值对于每个请求都是唯一的。通常使用的请求范围组件是FormHandler,用于处理单个请求。
  4. 窗口:维护的范围和值将是唯一的 浏览器窗口已关闭。 Window范围组件
    一般用于购物中心组件的CSC应用程序等。 使用基于业务的任何范围的组件是很好的 要求,但将其声明为全球并使用它将是一个 有利于提高应用程序的性能。       它是一个拇指规则,在全局范围组件中具有业务逻辑,并在需要时从较低范围的组件引用它。 这将减少等待垃圾收集的线程。