Запрос OpenCmis медленнее, чем Apache cmis Workbench

Я делаю довольно простой запрос

SELECT cmis:objectId, cmis:name, cmis:parentId
FROM cmis:folder
ORDER BY cmis:name

Выполнение этого запроса с помощью Apache cmis Workbench занимает ~ 15 секунд. Выполнение этого же запроса с opencmis довольно быстро, но получение результата очень медленное ~ 3 минуты.

session.query( queryStmt, false).iterator().toList()

Разделив звонки вот так

def rs = session.query( queryStmt, false)
def iterator = rs.iterator()
def folders = iterator.toList()

Я смог определить, что toList() это где медленно. Но я не понимаю почему.

Я также попытался определить OperationContext и использовать его с запросом. Те же результаты. Вот моя операция контекста

def filter = "cmis:objectId,cmis:name,cmis:parentId"
def context = session.createOperationContext()
context.setCacheEnabled(false)
context.setFilterString(filter)
context.setRenditionFilterString(filter)

Любая идея о том, как выполнить этот запрос быстрее?

2 ответа

CMIS Workbench по умолчанию выбирает только первые 100 обращений. В зависимости от хранилища, это обычно быстро. Увеличьте "максимальное количество ударов", чтобы получить больше.

Чтобы повторить то, что делает CMIS Workbench, попробуйте следующий фрагмент кода:

String queryStmt = "SELECT cmis:objectId, cmis:name, cmis:parentId FROM cmis:folder ORDER BY cmis:name";
int maxHits = 100;

OperationContext context = session.createOperationContext();
context.setMaxItemsPerPage(maxHits);

session.query(queryStmt, false, context).getPage(maxHits).iterator().toList();

toList перебирает все результаты запроса. По умолчанию OperationContext определяет пакеты по 100 обращений. Таким образом, под капотом OpenCMIS будет делать несколько (возможно, много) запросов запросов к хранилищу, запрашивая первые 100 обращений, вторые 100 обращений, третьи 100 обращений,...

Если у вас в общей сложности миллион обращений, вы в конечном итоге получите несколько внутренних вызовов.

Попробуйте увеличить размер партии с context.setMaxItemsPerPage(1000000), Это обычно быстрее, если у вас много хитов и вы хотите, чтобы они были представлены в виде списка.

Маленькие партии лучше, когда вы потребляете их в цикле и не нуждаетесь в них сразу. Это также позволяет обрабатывать наборы результатов, которые не помещаются в память клиентов.

И еще один аспект: избавиться от ORDER BY и сортировать список позже в Java. В любом случае, у вас есть результат в памяти. Если репозиторий не имеет индекса на cmis:name, это может замедлить обработку запросов на стороне сервера.

Спасибо Florian Müller за вашу помощь.

Именно он решил мою проблему.

def context = session.createOperationContext()
context.includeAllowableActions = false
context.maxItemsPerPage = 15000
def folderList = session.query(getFoldersList, false, context).iterator().toList()

Конечно, в реальной жизни максимальное количество элементов на странице не должно быть произвольным числом, подобным этому.

Другие вопросы по тегам