写在前面
为了与大家保持一个愉快的沟通,以及便于描述方便,本文做了一些术语简写,如下:
global:全局变量,无特殊说明,指的就是 std-globalstd-globals : 标准globalpro-globals: 进程globalref-global: 扩展映射globalnak-global:省略的global引用nak-cursor :省略的global的游标temp-global:临时全局变量1. 概述
对于某些操作,您可能需要全局变量的强大功能,而不需要无限期地保存数据。例如,您可能希望使用全局对不需要存储到磁盘的某些数据进行排序。对于这些操作,InterSystems IRIS 提供了临时全局变量的机制。
临时全局变量具有以下特征:
临时全局变量存储在 IRISTEMP 数据库中,该数据库始终定义为本地(即非网络)数据库。映射到 IRISTEMP 数据库的所有全局变量都被视为临时全局变量。
对临时全局变量的更改不会写入磁盘。相反,这些更改保留在内存中缓冲池中。如果缓冲池中没有足够的空间来容纳大型临时全局变量,则可以将其写入磁盘。
为了获得最高效率,对临时全局变量的更改不会记录到日志文件中。
每当重新启动系统间 IRIS 时,都会自动删除临时全局变量。(注意:重新启动实时系统可能需要很长时间;因此,您不应指望它来清理临时全局变量。
2. 使用临时全局变量
使用临时全局变量的机制的工作原理如下:
对于应用程序命名空间,您可以定义一个全局映射,以便将具有特定命名约定的全局数据库映射到 IRISTEMP 数据库,该数据库是一个特殊的数据库。例如,您可以定义一个全局映射,以便所有名称为 ^AcmeTemp* 的全局变量都映射到 IRISTEMP 数据库。
当您的代码需要临时存储数据并再次读取数据时,您的代码将写入和使用该命名约定的全局变量并从中读取数据。
例如,若要保存值,您的代码可能会执行以下操作:
set ^AcmeTempOrderApp("sortedarray")=some value
然后,稍后您的代码可能会这样做:
set somevariable = ^AcmeTempOrderApp("sortedarray")
通过使用临时全局变量,可以利用 IRISTEMP 数据库未记录的事实。由于数据库未被记录,因此使用该数据库的操作不会生成日志文件。日志文件可能会变大,并可能导致空间问题。但是,请注意以下几点:
您无法回滚任何修改 IRISTEMP 数据库中的全局变量的事务。此行为特定于 IRISTEMP。如果需要通过事务管理临时工作,请不要在 IRISTEMP 中使用全局变量来实现此目的。
请注意,仅将 IRISTEMP 用于不需要保存的工作。
当 IRISTEMP 全局需要更多内存时,其大小会增加。您可以使用 MaxIRISTempSizeAtStart 参数来帮助管理 IRISTEMP 的大小。
3. 为临时全局变量定义映射
要为临时全局变量定义映射,请执行以下操作:
选择命名约定,并确保所有开发人员都知道它。请注意以下几点:
考虑是具有多个临时全局变量还是具有多个节点的较少临时全局变量。与读取或写入等效数量的单独全局变量相比,InterSystems IRIS更容易在同一全局中有效地读取或写入不同的节点。对于少量的全局变量,效率差异可以忽略不计,但当有数百个单独的全局变量时,效率差异是显而易见的。
如果计划在多个命名空间中使用相同的全局映射,请设计一个系统,以便一个命名空间中的工作不会干扰另一个命名空间中的工作。例如,可以使用命名空间名称作为全局变量中的下标。
同样,即使在一个命名空间中,也要设计一个系统,以便代码的每个部分使用相同的全局或同一全局中的不同下标,以避免干扰。
不要使用系统保留的全局名称。
在管理门户中,导航到“命名空间”页(“系统管理>配置>系统配置>命名空间”)。
在应用程序命名空间的行中,单击“全局映射”。
在“全局映射”页中,单击“新建全局映射”。
对于“全局数据库位置”,请选择“IRISTEMP”。
对于“全局名称”,请输入以星号 (*) 结尾的名称。不要包含名称的初始插入符号。例如:AcmeTemp*,此映射会导致所有具有启动 AcmeTemp* 的名称的全局变量映射到 IRISTEMP 数据库。
单击“确定”。
注意:新映射行的第一列中显示的>>符号表示您已打开映射进行编辑。
4. 系统使用
请注意,InterSystems 使用临时系统全局变量作为暂存空间,例如,在执行某些查询(用于排序、分组、计算聚合等)期间用作临时索引。这些全局变量会自动映射到 IRISTEMP,包括:
^IRIS.Temp*
^CacheTemp*
^mtemp*
永远不要改变这些全局变量中的任何一个。
5. ^CacheTemp Globals
从历史上看,客户使用名称以“^CacheTemp”开头的全局变量作为临时全局变量。按照惯例,这些全局变量使用以“^CacheTempUser”开头的名称,以避免与临时系统全局变量发生冲突。但是,最佳做法是定义您自己的临时全局变量并将其映射到 IRISTEMP。
6. 工具方法
InterSystems IRIS 还提供了以下 API 来执行本章中描述的一些任务:
%SYSTEM.OBJ 类提供了以下方法:
Export() 使您能够将全局变量导出到 XML 文件。
Load() 和 LoadDir() 使您能够导入 XML 文件中包含的全局变量。
这些也可以通过$SYSTEM变量获得,例如:$SYSTEM.OBJ.Export
%Library.Global 提供了以下方法:
Export() 使您能够将全局变量导出为 .gof 和其他文件格式(不包括 XML)。
Import() 使您能够将全局变量导入到 .gof 和其他文件格式(不包括 XML)。
%Library.Global还提供了 Get() 类查询,您可以使用该查询在给定搜索条件的情况下查找全局变量。
有关其他 API 的,请参阅 InterSystems Programming Tools Index 中的 Globals