【问题标题】:XDMP-NEWSTAMP error when loading data with MLCP使用 MLCP 加载数据时出现 XDMP-NEWSTAMP 错误
【发布时间】:2016-04-07 17:05:32
【问题描述】:

我有一个附加到 4 个森林的数据库,我想在每次文档中的任何值更改时在 MarkLgic 中创建一个更改文档。变更文件应包含变更日期、旧值和新值。

我能够通过使用提交前和提交后触发器来实现这一点。 pre-commit 触发器捕获文档的旧版本,post-commit 具有新版本。我比较这两个文档并创建更改文档。 这在更新单个文档时效果很好。

但是,我通过使用 MLCP 从分隔文件加载 20000 个文档来测试此解决方案。我更改了所有文档中单个元素的值,然后再次加载数据。 我的触发器只能捕获 20000 个更改文档中的 7000 个。其余文档加载失败,我在 MLCP 中收到一条错误消息:

“XDMP-NEWSTAMP 时间戳对于森林来说太新”

我通过从提交前和提交后触发器中删除我的代码进行了另一项测试,并且让触发器不执行任何操作。我再次装入文件。现在 19000/20000 文档已成功更新,我得到相同的 XDMP-NEWSTAMP 错误。

当我完全移除触发器并加载文档时。 20000/20000 已加载和更新。

因此,执行大量触发器似乎会在加载文档时产生问题。

这个问题有解决方案吗? 我是否走错了路来完成我需要做的事情?

MLCP 命令: mlcp import -host localhost -port 8000 -username uname -password pwd -input_file_path D:....\file.dsv -delimiter '|' -input_file_type delimited_text -database Overtime -output_collections 测试

创建触发器:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace trgr="http://marklogic.com/xdmp/triggers" at "/MarkLogic/triggers.xqy";
trgr:create-trigger("PreCommitTrigger", "Trigger that fires when a document is updated", 
trgr:trigger-data-event(
  trgr:collection-scope("test"),
  trgr:document-content("modify"),
  trgr:pre-commit()),
  trgr:trigger-module(xdmp:database("Overtime"), "/", "preCommit.xqy"),
  fn:true(), xdmp:default-permissions()),

trgr:create-trigger("PostCommitTrigger", "Trigger that fires when a document is updated", 
trgr:trigger-data-event(
  trgr:collection-scope("test"),
  trgr:document-content("modify"),
  trgr:post-commit()),
  trgr:trigger-module(xdmp:database("Overtime"), "/", "postCommit.xqy"),
  fn:true(), xdmp:default-permissions())

加载触发文档:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";

xdmp:document-insert('/preCommit.xqy', 
text{ " '' "}).
xdmp:document-insert('/postCommit.xqy', 
text{ " '' "})

【问题讨论】:

  • 您是否指定了时间戳?请发布您正在使用的 MLCP 命令,并提供有关触发操作的更多信息。
  • 我在使用带有触发器的 mlcp 时遇到了类似的问题。正如您自己所说,即使触发器为空,mlcp 也非常快,而 MarkLogic 也难以跟上。我很想知道最好的解决方案是什么。作为一种解决方法,也许您可​​以将 mlcp 作业分成更小的批次并等待 MarkLogic 完成。
  • @wst 不,我没有指定时间戳,我在问题中添加了更多细节。
  • 我也是 :) 顺便说一句,我看到 XDMP-NEWSTAMP 是一个可重试的异常。您是否尝试在触发器中捕获它并再次尝试提交?
  • 这是有道理的。我已经向 MarkLogic 开了一张关于这个问题的票。因为在批量加载期间想要转换数据似乎是一个常见的用例,他们应该能够为我提供一些建议。一旦我得到他们的答复,我会更新帖子。

标签: triggers marklogic mlcp nosql


【解决方案1】:

MarkLogic 具有 CPF(内容处理框架 - https://docs.marklogic.com/guide/cpf/quickStart?hq=CPF),可帮助您对文件进行任何转换,在这种情况下,您可以有一个工作流来管理插入的任何文件、分析文件并创建 DLS(@ 987654322@) 版本。 DLS 是一个允许您控制文件版本的库,我想这就是您想要做的。希望对你有所帮助。

【讨论】:

  • 我在 MarkLogic 中查看了 CPF,但我注意到我仍然必须同时配置触发器,如果​​触发器导致使用 M​​LCP 批量加载数据出现问题,那么我想我会有相同的即使我使用 CPF 也有问题。
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2016-08-20
相关资源
最近更新 更多