Как отладить неэффективный запрос JCR в шаблоне FreeMarker? - PullRequest
0 голосов
/ 09 января 2020

У меня есть шаблон Magnolia FreeMarker, который многократно выполняет (1400+ раз на загрузку страницы) простой, но ненужный выбор по запросу ID JCR. Например:

select BUNDLE_DATA FROM BUNDLE WHERE NODE_ID = ? 

Из-за сложности кода FreeMarker я не могу определить, какая строка (строки) вызывает повторный запрос.

Как отлаживать запросы JCR в Магнолии, чтобы я мог определить код FreeMarker, который вызывает повторные запросы?

1 Ответ

1 голос
/ 10 января 2020

Переход на уровень БД идет слишком глубоко. Вышеуказанный запрос заключается в том, чтобы запрос JCR о получении всех свойств узла с идентификатором, равным NODE_ID, но, как вы говорите, бессмысленно с точки зрения сообщать, где / какая операция его вызывает.

Может быть любым из:

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

до:

node.getNode('some_subpath')

до:

searchfn.searchPages('...')

или даже:

cmsfn.children(node)

и, возможно, еще немного.

Чтобы еще больше усложнить ситуацию, вы увидите запрос к БД, только если локальный (в памяти) кэш jcr не содержит элемент, запрошенный вашим шаблоном, так что вы даже не будете надежно перехватывать все запросы контента на уровне БД.

Одно можно сказать наверняка: запрос 1k + узлов для рендеринга одного шаблона в большинстве случаев указывает на то, что вы делаете что-то не так (если вы действительно не хотите рендерить что-то вроде резюме или обзор, охватывающий тысячи узлов).

Самый простой путь вперед - перестать думать о logi c в вашем шаблоне. Если он содержит несколько компонентов, вы пытаетесь прибить его к данному компоненту, чтобы ограничить пространство поиска, например, удаляя компоненты один за другим и наблюдая за изменениями.

Если это сводится к выполнению какого-либо запроса JCR, Вы можете настроить ведение журнала уровня отладки напрямую:

info.magnolia.templating.functions.SearchTemplatingFunctions

Это предполагает, что вы использовали searchfn для поиска по шаблону. В других случаях отладка будет немного сложнее, так как обычный JCR Node API используется для получения также всего другого содержимого (например, связанного с конфигурацией), а не только того, которое отображается на странице.

Вероятно, это одиночная команда или l oop в вашем шаблоне, что приводит к тому, что синхронизация выполнения различных частей шаблона также может дать вам подсказку и помочь сузить проблему. Если вы поделитесь самим шаблоном, возможно (но не гарантировано), что мы сможем найти в нем что-то и дать вам более точные индикаторы.

...