优化吊索查询

时间:2014-01-21 20:59:06

标签: cq5 jackrabbit jcr sling

我有一个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");

不幸的是,如果它正在通过一个包含大量内容的路径,则页面会超时。有没有办法优化这样的功能或提高性能的技巧?

2 个答案:

答案 0 :(得分:1)

<强> 1。使用比nt:unstructured更具体的JCR类型。

我猜您正在寻找网页节点,因此请尝试cq:Page或(甚至更好)cq:PageContent

<强> 2。对数据进行非规范化。

如果我正确理解您的查询,它应该返回包含resource1或resource2的页面。而不是使用非常昂贵且阻止JCR使用索引的contains()谓词,而是使用附加属性标记包含这些资源的页面。例如,设置适当的jcr:content/containsResource1jcr:content/containsResource2属性,然后在查询中使用它们:

select * from cq:PageContent where (containsResource1 is not null or containsResource2 is not null) and jcr:path like '/content/some/path/%'

您可以使用EventHandlerSlingPostProcessor在添加resource1或resource2时自动设置属性。

答案 1 :(得分:1)

我在您的问题中添加了“jackrabbit”和“jcr”标签 - 我不是JCR查询的专家,但其中一位专家可能想对您正在使用的查询语句发表评论,以及是否以及如何优化。

话虽这么说,你的“页面超时”声明似乎意味着它是超时的客户端浏览器,因为它不会长时间接收数据。我首先检查(使用调试器或日志语句)是否真的是需要太长时间的findResources调用,或者如果它的代码在那之后运行那就是罪魁祸首。

如果findResources很慢,您需要优化查询或重新设计代码以使其异步,例如让客户端代码首先获取HTML页面,然后通过异步调用获取查询结果。

如果在findResources之后运行的代码导致超时,您可以重新设计它以尽快开始向浏览器发送数据,并定期刷新输出以避免超时。但是,如果您发现许多结果对用户来说可能需要太长时间,那么也需要更多的异步行为。