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

How do I debug an inefficient JCR query in FreeMarker template?

我有一个 Magnolia FreeMarker 模板,它重复执行(每次页面加载 1,400 多次)一个简单但不必要的 select ID JCR 查询。例如:

select BUNDLE_DATA FROM BUNDLE WHERE NODE_ID = ? 

由于 FreeMarker 代码的复杂性,我无法判断是哪一行导致了重复查询。

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

进入数据库级别太深了。上面的查询是 JCR 请求获取 ID 等于 NODE_ID 的节点的所有属性,但正如您所说,就告诉您 where/what 操作导致它而言是没有意义的。

可以是任何来自:

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

至:

node.getNode('some_subpath')

至:

searchfn.searchPages('...')

甚至:

cmsfn.children(node)

可能还有更多。

为了使事情更加复杂,只有当本地(内存中)jcr 缓存不包含您的模板请求的项目时,您才会看到对数据库的查询,因此您甚至无法捕获所有内容请求可靠地在数据库级别。

有一件事是肯定的,在大多数情况下,为单个模板渲染请求 1k+ 个节点表明你做错了什么(除非你确实想渲染某种超过数千个节点的摘要或概述)。

最简单的方法是先停止思考模板中的逻辑。如果它包含多个组件,您尝试将其固定到给定组件以限制搜索 space,例如通过一个接一个地删除组件并观察变化。

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

info.magnolia.templating.functions.SearchTemplatingFunctions

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

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