![](/img/trans.png)
[英]Minimum set of libraries required to use Jackrabbit JCR implementation?
[英]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.