我有一个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");
不幸的是,如果它正在通过一个包含大量内容的路径,则页面会超时。有没有办法优化这样的功能或提高性能的技巧?
答案 0 :(得分:1)
<强> 1。使用比nt:unstructured
更具体的JCR类型。
我猜您正在寻找网页节点,因此请尝试cq:Page
或(甚至更好)cq:PageContent
。
<强> 2。对数据进行非规范化。
如果我正确理解您的查询,它应该返回包含resource1或resource2的页面。而不是使用非常昂贵且阻止JCR使用索引的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时自动设置属性。
答案 1 :(得分:1)
我在您的问题中添加了“jackrabbit”和“jcr”标签 - 我不是JCR查询的专家,但其中一位专家可能想对您正在使用的查询语句发表评论,以及是否以及如何优化。
话虽这么说,你的“页面超时”声明似乎意味着它是超时的客户端浏览器,因为它不会长时间接收数据。我首先检查(使用调试器或日志语句)是否真的是需要太长时间的findResources调用,或者如果它的代码在那之后运行那就是罪魁祸首。
如果findResources很慢,您需要优化查询或重新设计代码以使其异步,例如让客户端代码首先获取HTML页面,然后通过异步调用获取查询结果。
如果在findResources之后运行的代码导致超时,您可以重新设计它以尽快开始向浏览器发送数据,并定期刷新输出以避免超时。但是,如果您发现许多结果对用户来说可能需要太长时间,那么也需要更多的异步行为。