locking - 在 Marklogic 中的指定时间释放所有文档锁
问题描述
我们计划使用xdmp:lock-acquire
MarkLogic 中的 API 为我们的文档实现锁定机制,并且没有超时选项。该文档将被锁定,直到用户编辑并保存该文档。作为其中的一部分,我们需要在指定时间释放所有锁,比如每天凌晨 12 点。
为此,我们可以使用xdmp:lock-release
API,但如果有很多文档,则需要一些时间才能完成。
有人可以建议在 MarkLogic 中实现这一目标的更好方法吗?
解决方案
如果您有可能需要处理的大量锁,并且担心超时或在单个事务中完成所有工作的其他问题,那么您可以将工作分解为更小的块或单个事务。
有多种批处理工具和框架可以做到这一点。CoRB是一种可以轻松插入自定义选择器和处理脚本以及针对巨型集执行的选项。
如果您希望从 MarkLogic 计划任务启动工作并在 MarkLogic 中执行所有工作,那么您可以生成多个任务来处理子集。
一个简单的示例演示如何为每个事务设置“块大小”并继续产生更多工作:
declare function local:release-locks($locks, $chunk-size){
if (exists($locks))
then (
(: release all of these locks(you might apply some sort of filter to restrict to a subset,
and maybe a try/catch in case the lock gets released before this runs) :)
$locks[1 to $chunk-size] ! xdmp:node-uri(.) ! xdmp:lock-release(.),
(: now spawn the next set to be released in a separate transaction :)
xdmp:spawn-function(function(){
local:release-locks(subsequence($locks, $chunk-size+1), $chunk-size)
},
<options xmlns="xdmp:eval">
<update>true</update>
<commit>auto</commit>
</options>)
)
else () (: nothing left to do, stop spawning work :)
};
let $locks := xdmp:document-locks()
let $chunk-size := 1000
local:release-locks($locks, $chunk-size)
如果您想走这条路,可以使用一些库:
将多个项目生成到任务服务器上的风险是,如果出现重启或中断,一些任务可能无法执行,并且所有锁都可能无法释放。但是,如果您只是想释放所有锁,则可以重新运行脚本以开始另一轮。
推荐阅读
- websocket - 如何从 WebSocket(协议缓冲区)查看二进制数据
- laravel - GroupBy 和 mapToGroups 返回 API 资源中的对象
- nativescript - 如何在 NativeScript 中使用 Protobuf?
- reactjs - 外部 React 组件不在 App.js 中呈现
- excel - 使用 1 列从其他 2 列“排序”重复项?
- javascript - 我可以在 PWA 中缓存“外部”图像吗?
- ansible - 检查文件/文件夹是否存在并在ansible中执行操作
- python - Django Wagtail:使用自己的 object.method 而不是重写 object.get_context 方法访问数据是不好的做法吗?
- python - 如何在 Heroku 上安装 discord.py-rewrite 依赖项以进行 Discord 机器人托管?
- android - 基于 2 spinner 加载图像