Java OpenCmis查询比apache cmis工作台慢

Java OpenCmis查询比apache cmis工作台慢,java,alfresco,cmis,opencmis,cmis-workbench,Java,Alfresco,Cmis,Opencmis,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.

我提出了一个非常简单的问题

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)

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

默认情况下,CMIS工作台只获取前100次点击。根据存储库的不同,这通常很快。增加“最大点击数”以获得更多

要复制CMIS工作台正在执行的操作,请尝试以下代码段:

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)
增加批处理大小。如果你有很多点击,并且想把它们都列为一个列表,这通常会更快

当您在一个循环中使用小批量产品时,它们会更好,并且不需要一次全部使用它们。它还允许处理不适合客户端内存的结果集

另一方面: 去掉
orderby
,稍后用Java对列表进行排序。不管怎样,结果集都已存储在内存中。如果存储库在
cmis:name
上没有索引,它会减慢服务器端的查询处理。

谢谢您的帮助

是他解决了我的问题

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

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

谢谢您的回答。你的解释很有道理。我试过了。然而,我经历了缓慢的响应时间。现在我不知道我的露天空间是否负荷较少,反应是否更快。我的java查询现在需要1分钟。但是它仍然比cmis workbench慢5倍。我的拙见是从workbench gui调用opencmis客户端api:看看这个,除了@florrian müller提出的配置之外,还有很多配置。我已经复制了这个,现在我的查询运行速度比以前快了4倍。我正在删除operationContext中的配置,以了解什么是重要的