簡體   English   中英

Apache Jackrabbit (JCR) 我應該使用哪個 API 進行大規模刪除

[英]Apache Jackrabbit (JCR) which API should I use for massive remove

我有一個遺留項目,它使用 Apache Jackrabbit (JCR) 2.0 版作為主存儲(有點過時,但我現在無法更改)。

我必須為未使用的節點和版本清理存儲,所以我正在迭代所有存儲樹,測試每個節點/版本是否應該被刪除。

我有一個javax.jcr.Session object。

刪除 API 在 for 循環中通過以下方式調用:

VersionManager vm = session.getWorkspace().getVersionManager();

Node root = session.getRootNode();
NodeIterator nodeIterator = root.getNodes();

for(int currentNode = 0; currentNode < nodeIterator.getSize(); currentNode ++) {

   Node node = nodeIterator.nextNode();

   VersionHistory versionHistory = vm.getVersionHistory(node.getPath());
   VersionIterator versionIterator = versionHistory.getAllVersions();
   for(int currentVersion = 0; currentVersion < versionIterator.getSize(); currentVersion ++) {
      Version version = versionIterator.nextVersion();

      if(shouldDelete(node, version)) {
         versionHistory.removeVersion(version.getName());
      }
   }
}

問題是removeVersion API 非常慢。

一個問題是,考慮到當我執行清理時,只有一個線程在存儲上工作,是否還有其他方法可以更快地 go。

我已經探索了javadoc,我發現應該有一個執行批處理操作的過程,這就是我的情況。 例如:

VersionManager vm = session.getWorkspace().getVersionManager();

RepositoryService rs = getRepositoryService(session);
SessionInfo si = getSessionInfo(session);
ItemId mainId = null;
Batch batch = rs.createBatch(si, mainId);

Node root = session.getRootNode();
NodeIterator nodeIterator = root.getNodes();

for(int currentNode = 0; currentNode < nodeIterator.getSize(); currentNode ++) {

   Node node = nodeIterator.nextNode();

   VersionHistory versionHistory = vm.getVersionHistory(node.getPath());
   VersionIterator versionIterator = versionHistory.getAllVersions();
   for(int currentVersion = 0; currentVersion < versionIterator.getSize(); currentVersion ++) {
      Version version = versionIterator.nextVersion();

      if(shouldDelete(node, version)) {
         ItemId id = getItemId(node, version);
         batch.remove(id);

         //versionHistory.removeVersion(version.getName());
      }
   }
}

// TODO: how to execute batch?

我對這批 api 有一些疑問

  • 如何從我的Session獲得RepositoryService
  • 如何從我的Session獲取SessionInfo
  • 創建Batch object 時傳遞的ItemId的含義是什么? 我應該傳遞什么樣的價值?
  • 如何從節點及其版本中獲取ItemId
  • 一旦我構建了我的Batch object 並刪除了所有內容,我該如何在我的 session 上執行它?

AFAIU、Batch 和 SessionInfo 是 Jackrabbit SPI 中的接口,它是 JCR API 的下一層,主要用於遠程處理(如通過 WebDAV)。

我不認為它會在這里幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM