Apache Jackrabbit (JCR) 我应该使用哪种API来进行大规模的删除

问题描述 投票:0回答:1

我有一个遗留项目,它使用Apache Jackrabbit (JCR) 2.0版本作为主存储(有点过时,但我暂时不能改变它)。

我必须清理存储中未使用的节点和版本,所以我在迭代所有的存储树,测试每个节点版本是否应该被删除。

我有一个 javax.jcr.Session 对象。

remove 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非常慢。

第一个问题 考虑到当我执行清理工作时,只有一个线程在存储上工作,是否有其他更快的方法。

我研究了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上。

  • 我怎么能得到一个 RepositoryService 从我 Session?
  • 我怎么能得到一个 SessionInfo 从我 Session?
  • 的意思。ItemId 通过时 Batch 对象被创建?我应该传递什么样的值?
  • 我怎样才能得到一个 ItemId 从一个节点和它的版本?
  • 一旦我建立了我的 Batch 对象及其所有的删除,我如何能在我的会话中执行它?
java jcr jackrabbit
1个回答
1
投票

AFAIU,Batch和SessionInfo是Jackrabbit SPI的接口,它是JCR API下面的一层,主要用于远程(比如通过WebDAV)。

我想在这里帮不了你。

© www.soinside.com 2019 - 2024. All rights reserved.