我想要一个可以在不同的 .xqy 页面中使用的全局变量。我可以在 Marklogic Server 的 xquery 中声明这样的变量吗?
4 回答
您可以在任何模块中声明变量。例如,它是 config.xqy。
declare variable $PRECISION as xs:integer := 4;
要使用此变量,您需要在工作模块中导入此模块。
import module namespace config = "http://your-namespace" at "config.xqy";
并参考这个变量:
$config:PRECISION
如果您的应用程序在单个 E 节点上运行,您可以使用服务器字段,它们也是为此用例设计的。
如果您需要跨服务器访问值,Marklogic XQuery Commons 中有一个用于存储持久键/值对的库:
https://github.com/marklogic/commons/blob/master/properties/properties.xqy
您可能已经考虑过这一点,但您也可以简单地将全局数据存储在数据库上的文档中,并使用 doc() 或 eval() 访问,如果您需要从不同的数据库中获取它。
你有几个选择。如果您需要一个全局常量变量,config.xqy
@Andrew Orlov 的答案中提到的方法很棒,因为您避免了对properties.xml
文件的并发访问的任何锁定。
如果您需要一个可以跨节点集群变异的变量,property.xqy
@wst 链接的示例似乎使用全局分配的命名空间来嵌入可检索的键和值。相当聪明。但是,我不确定这对重大变化意味着多少。
@Eric Bloch的E-node特定变量很好,但也请注意,它不会在系统重新启动后继续存在。
我很想知道这些在性能方面是如何比较的。