2

根据文件,

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

这是否意味着,对于全局组件,整个核心系统只有一个实例。如果这是真的,那么它对像“/atg/dynamo/transaction/TransactionManager”这样的组件和大多数液滴......如何有效?因为这些组件同时被多个用户使用

编辑:

我理解“TransactionManager”的行为。根据定义应该有一个事务管理器,并且他应该为每个事务保留事务对象。但是我的问题对于像foreach,switch等这样的液滴仍然有效(它们中的大多数都是全局范围的)如果整个核系统只有一个对应类的实例,它不会对性能产生不良影响吗?

4

3 回答 3

6

从历史上看,ATG 提供了三种不同类型的示波器。现在增加到 5 个,增加了 Window(一般只在 CSC 应用程序中使用,所以尽量不要使用它)和 Prototype(添加以支持使用 Endeca Cartridge Handlers)。

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

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

因此,在ForEach液滴的情况下,它会被实例化一次,但在service方法中它实际上是从请求中提取参数:

String elementName = pRequest.getParameter(ELEMENT_NAME);

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

于 2013-09-05T11:50:14.653 回答
1

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

于 2013-09-17T09:37:43.877 回答
1

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

  1. 全局:如果未定义范围,这是组件的默认范围。这些组件将被初始化一次,并将作为一个全局对象存在。将所有 Droplet、工具、管理器和其他配置组件作为全局组件是最佳实践
  2. 会话:维护的范围和值对于每个会话都是唯一的。通常使用的会话范围组件有 ShoppingCart (Order)、Profile、SearchFormHandler 等。
  3. 请求:维护的范围和值对于每个请求都是唯一的。通常使用的请求范围组件是处理单个请求的 FormHandler。
  4. 窗口:在关闭浏览器窗口之前,范围和维护的值将是唯一的。Window 范围组件
    通常在 CSC 应用程序中用于 ShoppingCart 组件等。根据业务
    需求使用任何范围的组件都很好,但将其声明为 Global 并使用它将有利于提高应用程序的性能。这是一个经验法则,在全局范围组件中具有业务逻辑,并在需要时从较低范围的组件中引用它。这将减少等待垃圾收集的线程。
于 2017-02-03T15:22:36.500 回答