我有一个遗留项目,它使用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
对象及其所有的删除,我如何能在我的会话中执行它?AFAIU,Batch和SessionInfo是Jackrabbit SPI的接口,它是JCR API下面的一层,主要用于远程(比如通过WebDAV)。
我想在这里帮不了你。