OpenCmis 查询比 apache cmis 慢 workbench

OpenCmis query slower than 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 并将其用于查询。 相同的结果。这是我的 operationContext

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

知道如何更快地执行此查询吗?

默认情况下,CMIS Workbench 仅获取前 100 个匹配项。根据存储库,这通常很快。增加 "max hits" 以获得更多。

要复制 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的帮助。

他解决了我的问题。

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

当然在现实生活中,每页的最大项目数不应该是这样的任意数字。