我有一个cq5组件,它需要查询两个其他组件类型的给定路径,如下所示:
String query = "select * from nt:unstructured where jcr:path like '/content/some/path/%' and ( contains(sling:resourceType, 'resourceType1') or contains(sling:resourceType, 'resourceType2')) ";
Iterator<Resource> resources = resourceResolver.findResources( query,"sql");不幸的是,如果它正在处理包含大量内容的路径,则页面会超时。有没有办法优化这样的函数或者提高性能的小贴士?
发布于 2014-01-22 17:06:45
JCR 1.使用比 nt:unstructured**.**更具体的类型
我猜您正在寻找页面节点,所以尝试使用cq:Page或(甚至更好) cq:PageContent。
2.反规范化你的数据。
如果我没理解错的话,它应该返回包含resource1或resource2的页面。与其使用contains()谓词,还不如使用额外的属性来标记包含这些资源的页面。例如,设置适当的jcr:content/containsResource1和jcr:content/containsResource2属性,然后在查询中使用它们:
select * from cq:PageContent where (containsResource1 is not null or containsResource2 is not null) and jcr:path like '/content/some/path/%'您可以使用EventHandler或SlingPostProcessor在添加resource1或resource2时自动设置属性。
发布于 2014-01-22 17:07:49
我已经在你的问题中添加了"jackrabbit“和" JCR”标签-我不是JCR查询方面的专家,但其中一位专家可能想要对你正在使用的查询语句以及如何优化查询语句进行评论。
也就是说,您的"page times“语句似乎暗示是客户端浏览器超时,因为它接收数据的时间不是太长。我会首先检查(使用调试器或日志语句)是findResources调用耗时太长,还是之后运行的代码才是罪魁祸首。
如果findResources很慢,您将需要优化查询或重新设计代码以使其成为异步的,例如,让客户端代码首先获取HTML页面,然后通过异步调用获取查询结果。
如果在findResources之后运行的代码导致超时,您可以重新设计它,以便尽快开始向浏览器发送数据,并定期刷新输出以避免超时。但是如果你发现了大量的结果,这对于用户来说可能会花费太长的时间,而且还需要一个更异步的行为。
https://stackoverflow.com/questions/21268976
复制相似问题