Сначала выберите все идентификаторы документов, например, в List<IDfId>
и закройте коллекцию. Не выполняйте другие дорогостоящие операции внутри открытой коллекции, потому что тогда вы излишне блокируете ее.
Это причина, почему он сделал только 50 документов. Поскольку у вас была одна основная открытая коллекция, и каждое выполнение операции удаления открывало другую коллекцию, и это, вероятно, достигло определенного предела. Итак, как я уже сказал, лучше сначала использовать коллекцию, а затем работать с этими данными:
List<IDfId> ids = new ArrayList<>();
try {
query.setDQL("SELECT r_object_id FROM my_report WHERE FOLDER('/Home', DESCEND)");
collection = query.execute(session, IDfQuery.DF_READ_QUERY);
while (collection.next()) {
ids.add(collection.getId("r_object_id"));
}
} finally {
if (collection != null) {
collection.close();
}
}
После этого вы можете перебирать список и выполнять все действия с нужным вам документом. Но не выполняйте операцию удаления в каждой итерации - это неэффективно. Вместо этого добавьте все документы в одну операцию и выполните ее один раз в конце.
IDfDeleteOperation deleteOperation = clientX.getDeleteOperation();
deleteOperation.setVersionDeletionPolicy(IDfDeleteOperation.ALL_VERSIONS);
for (IDfId id : ids) {
IDfDocument document = (IDfDocument) session.getObject(id);
...
deleteOperation.add(document);
}
deleteOperation.execute();
То же самое для IDfCancelCheckoutOperation
.
И еще одна вещь - когда вы используете FileWriter
, используйте close()
в блоке finally
или используйте try-with-resources, как это:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("file.path", true))) {
writer.write(document.dump());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
Использование StringBuilder
- хорошая идея, но создайте его только один раз в начале, добавьте все атрибуты в каждой итерации, а затем запишите содержимое StringBuilder
в файл в конце, а не во время каждой итерации - это медленный.