У меня есть устаревший проект, который использует Apache Jackrabbit (JCR) версии 2.0 в качестве основного хранилища (немного устарело, но сейчас я не могу его изменить).
Мне нужно очистить хранилище для неиспользуемые узлы и версии, поэтому я перебираю все дерево хранилища, проверяя для каждого узла / версии, следует ли его удалить или нет.
У меня есть объект javax.jcr.Session
.
remove API вызывается в for l oop по:
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 быстрее, учитывая, что когда я выполняю очистку, с хранилищем работает только один поток.
Я изучил javado c и понял что должна быть процедура для выполнения пакетных операций, как в моем случае. Например:
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
объект со всем его удалением, как я могу выполнить его во время сеанса?