执行环境

Oracle Data Relationship Management 引擎是一个多线程、多计算机的环境,脚本可在多个线程以及多台计算机上同时执行。虽然您可以创建值并将其存储在全局范围内,但不应依赖于此行为,因为在其他线程上执行脚本时不会提供该全局值。同样,全局值不会在多个 Data Relationship Management 引擎实例或计算机内进行更新。此外,由于 Data Relationship Management 支持多个活动版本,因此如果您针对某个节点计算了值并将该值存储在全局范围内,则在其他脚本访问另一个节点的该属性时可能生成错误的值。

注:

基于同一原因,您不应在全局范围内存储变量,还应避免修改 Data Relationship Management 内置的对象原型,因为无法确保修改应用于所有引擎实例和线程。

设置脚本超时

为防止出现过多的引擎锁,将基于超时设置终止执行时间太长而未返回值的脚本。可以针对每个属性定义和验证设置脚本超时。

超时是基于每个执行上下文的,因此,如果要导出 100 个节点的脚本属性,且该属性的超时设置为 30 秒,则导出最多需要 50 分钟,因为每个节点只能花费 30 秒来计算其属性。但是,如果脚本属性调用了其他脚本属性,则其超时值不会增加。例如,如果 PropA 的超时值为 10 秒,PropB 的超时值为 20 秒,且 PropA 调用了 PropB,而后者将启动一个运行很长时间的计算过程,则在 10 秒之后,PropA 的计算将终止,因为已超出其原始超时值。

防止无限循环

脚本进入无限循环(也称为堆栈溢出)是一种严重错误,这会导致服务器进程意外终止。虽然 Data Relationship Management 会尝试阻止此类脚本执行,但是在编写自我引用或递归脚本时,务必要小心谨慎。在将新脚本部署到生产环境之前,要始终先在开发环境中对其进行测试。

下面是一个将进入无限循环的脚本的简单示例。因为该脚本包含了对自身的调用,但是从不终止执行,所以,执行此函数的引擎最终将由于缺乏资源而终止。而且,因为该脚本从未调用 Data Relationship Management 引擎,所以就没有机会捕获溢出并停止脚本。

function badFunc(a) { badFunc(a); }
badFunc("oops");

性能注意事项

要实现最佳性能,请避免在脚本中引用公式派生的属性,反之亦然。鉴于本机硬件(包括 64 位处理器)的即时 (just-in-time, JIT) 编译等因素,与公式相比,脚本通常最有可能进行性能调优。还可以根据实际执行特征通过 JIT 编译器对脚本进行调优,而且随着时间的推移脚本运行速度将加快。