2016-04-07 93 views
2

我有一个数据库附加到4个森林,我想在每次文档中的任何值更改时在MarkLgic中创建一个更改文档。更改文件应包含更改日期,旧值和新值。使用MLCP加载数据时发生XDMP-NEWSTAMP错误

我能够通过使用预先提交和提交后触发器来完成该操作。 预提交触发器捕获文档的旧版本,提交后具有新版本。我比较这两个文档并创建更改文档。 这在更新单个文档时效果很好。

但是,我通过使用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加班-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{ " '' "}) 
+1

你是否指定时间戳?请发布您正在使用的MLCP命令,并提供有关触发器操作的更多信息。 – wst

+0

我遇到过使用带触发器的mlcp的类似问题。就像你自己所说的那样,即使触发器是空的,mlcp速度非常快,MarkLogic也难以跟上。我有兴趣听到最好的解决方案。作为一种解决方法,您可以将mlcp作业拆分为更小的批次,然后等待MarkLogic完成。 – chriskelly

+0

@wst不,我没有指定时间戳,我在这个问题中增加了更多细节。 – user3916117

回答

1

MarkLogic有CPF(内容处理框架 - https://docs.marklogic.com/guide/cpf/quickStart?hq=CPF),这将有助于你做出任何文件转换,在这种情况下,您可以有一个工作流程来管理插入的任何文件,分析文件并创建一个DLS(https://docs.marklogic.com/dls)版本。 DLS是一个库,可以让你控制文件的版本,我猜这是你想要做的。希望它能帮助你。

+0

我在MarkLogic中查看了CPF,但我注意到我仍然需要配置触发器,如果​​触发器导致用MLCP批量加载数据时出现问题,那么我想我即使使用CPF也会遇到同样的问题。 – user3916117

相关问题