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

Jan*_*ana 2 components scope atg atg-dynamo

根据文件,

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

这是否意味着,对于全局组件,整个核系统只有一个实例.如果这是真的,它对于像'/ atg/dynamo/transaction/TransactionManager'这样的组件和大多数小滴有效吗?因为这些组件在一个时刻被多个用户使用

编辑:

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

rad*_*mpe 6

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

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

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

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

String elementName = pRequest.getParameter(ELEMENT_NAME);
Run Code Online (Sandbox Code Playgroud)

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