根据文件,
全局:组件在所有用户之间共享。 会话:为每个用户提供组件的单独实例。
这意味着,对于全局组件,整个核系统只有一个实例。 如果这是真的,那对于像'/ atg / dynamo / transaction / TransactionManager'这样的组件以及大多数飞沫来说它是如何有效的? 因为这些组件在一个时刻被多个用户使用
编辑:
我理解'TransactionManager'的行为。根据定义,应该有单个事务管理器,并且他应该为每个事务保留事务对象。 但我的问题仍然适用于像foreach,switch等小滴(大多数都是全局范围的) 如果整个核系统只有一个相应类的实例,那么它对性能有不良影响吗?
答案 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种不同的组件范围