【问题标题】: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 种不同范围的组件

    1. 全局:如果未定义范围,这是组件的默认范围。 这些组件将被初始化一次,并将作为 全局对象。拥有所有 Droplet、工具、 全局管理器和其他配置组件
    2. 会话:维护的范围和值对于每个 会议。通常使用的会话范围组件是 ShoppingCart (Order)、Profile、SearchFormHandler 等。
    3. 请求:维护的范围和值对于每个请求都是唯一的。通常使用的请求范围组件是处理单个请求的 FormHandler。
    4. 窗口:范围和维护的值将是唯一的,直到 浏览器窗口关闭。 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 是请求范围的,那么您可能做错了)。

        【讨论】:

          猜你喜欢
          • 2017-01-15
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          • 2017-06-11
          • 2018-03-05
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多