MarkLogic如何向指定forest插入文档 解决同URI跨forest报错
MarkLogic插入指定多forest触发XDMP-PLACEKEYSLOCKING错误解决方案
报错信息
[1.0-ml] XDMP-PLACEKEYSLOCKING: xdmp:document-insert("/xquery/catalog.xml", 557........., (), (), 0, (xs:unsignedLong("13222250964842568399"), xs:unsignedLong("15490631252765310070"))) -- Fast locking cannot be used with place keys
错误根因
当调用xdmp:document-insert时如果传入了多个目标forest作为放置键参数,而当前数据库开启了*快速锁定(Fast locking)*配置时,就会触发该报错。快速锁定模式本身不支持同时指定多个目标forest写入。
复现同URI跨forest插入的解决方案
方案1:调整数据库锁定配置
- 进入MarkLogic管理后台的
test-dup数据库配置页面 - 将「快速锁定」配置项从默认的
fast修改为strict或off - 重启
test-dup关联的所有forest后即可生效
注意:关闭快速锁定会降低数据库写入吞吐量,生产环境调整前请先做性能压测评估
方案2:修改插入代码,单次仅指定单个目标forest
你当前使用的原始代码直接传入了test-dup的所有forest列表,才触发了冲突。如果要将同URI的文档写入不同forest,每次调用插入函数时仅指定一个目标forest即可,参考修改后的代码:
xquery version "1.0-ml"; let $XML:=<catalog> <product dept="WMN"> <number>557</number> <name language="en">Fleece Pullover</name> <colorChoices>navy black</colorChoices> </product> let $filename:= "/xquery/catalog.xml" (: 每次仅传入1个目标forest ID,即可避免快速锁定冲突 :) let $target-forest := xdmp:database-forests(xdmp:database("test-dup"))[1] return xdmp:document-insert($filename,$XML,(),(),0,$target-forest)
如果要插入到第二个forest,只需要把下标[1]改成[2]即可。
内容的提问来源于stack exchange,提问作者thichxai
相关产品推荐
相关产品推荐

