如何在FreeMarker模板中调试效率低下的JCR查询?

问题描述 投票:0回答:1

我有一个Magnolia FreeMarker模板,它反复执行(每页加载1400次以上)一个简单但不必要的ID JCR查询选择。例如:

select BUNDLE_DATA FROM BUNDLE WHERE NODE_ID = ? 

由于FreeMarker代码的复杂性,我无法确定是哪一行引起重复查询。

如何在木兰中调试JCR查询,以便确定导致重复查询的FreeMarker代码?

freemarker jcr magnolia
1个回答
1
投票

在数据库级别上太深了。上面的查询是JCR请求,以获取w / ID等于NODE_ID的节点的所有属性,但是正如您所说的那样,从告诉您什么地方/什么原因导致它是没有意义的。

可能来自:

ctx.getJCRSession('some_workspace').getNode('some_path')

至:

node.getNode('some_subpath')

至:

searchfn.searchPages('...')

甚至:

cmsfn.children(node)

可能还有更多。

为了进一步使事情复杂化,仅当本地(内存中)jcr高速缓存不包含模板请求的项目时,您才会在数据库上看到查询,因此您甚至都不会在数据库级别捕获所有对内容的请求可靠。

可以肯定的是,在大多数情况下,请求1k +个节点进行单个模板渲染表示您做错了(除非您确实想渲染某种摘要或概述超过数千个节点)。

最简单的方法是先停止考虑模板中的逻辑。如果它包含多个组件,请尝试将其固定在给定的组件上,以限制搜索空间,例如,一一删除组件并观察更改。

如果归结为正在执行某些JCR查询,则可以直接在以下位置配置调试级别日志记录:

info.magnolia.templating.functions.SearchTemplatingFunctions

这是假设您正在使用searchfn从模板中进行搜索。对于其他用例,调试会比较困难,因为使用普通的JCR Node API也要获取所有其他内容(例如与配置有关的内容),而不仅仅是获取页面上呈现的内容。

类似的情况是,这是模板中的单个命令或循环导致它,因此定时执行模板的不同部分也可以为您提供线索并帮助缩小问题的范围。如果您共享模板本身,则可能(但不能保证)我们可以在其中发现某些内容并为您提供更精确的指标。

© www.soinside.com 2019 - 2024. All rights reserved.