2016-04-07 74 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

相關問題