Использование dataManager в скрипте количества папок приложения вызывает дикий рост числа запросов

Для трех папок приложения нам потребовалось отображать число записей с учетом возможных ограничений ограничений.
В скрипте количества записей папок приложения стали использовать dataManager.getCount(loadContext) и вдруг получили дикую задержку в десятки секунд при логине пользователя в приложение.
Скрипт простой:

import ru.cs_consult.simpledoc.entity.RCDoc
import com.haulmont.cuba.core.global.AppBeans
import com.haulmont.cuba.core.global.LoadContext
import com.haulmont.cuba.core.global.DataManager

DataManager dataManager = AppBeans.get(DataManager.class)
String q = 'SELECT d from simpledoc$RCDoc d where (d.docKind = @enum(ru.cs_consult.simpledoc.entity.DocKind.Internal))'
LoadContext<RCDoc> loadContext = LoadContext.create(RCDoc.class).setQuery(LoadContext.createQuery(q))
int count = dataManager.getCount(loadContext)
return count

Т.к. в таблице, по которой идет расчет количества записей, всего буквально порядка 200 записей - эффект, на мой взгляд, странный.
БД на MS SQL 2008.
Стали изучать трассу на стороне MS SQL и обнаружили, что при логине единственного пользователя в приложение результирующий запрос подсчета количества записей в папке вида SELECT COUNT(ID) FROM SIMPLEDOC_RC_DOC WHERE ((DOC_KIND = @P0) AND (DELETE_TS IS NULL)) выполняется подряд несколько сотен раз (порядка 400).
Т.е. если у нас три папки, то это более чем по 100 одинаковых запросов SELECT COUNT(ID)....
Это точно не связано с периодом обновления папок приложения, т.к. установлен интервал обновления 10 секунд, а несколько сотен запросов для подсчета количества записей в трех папках отправляются в интервале 1 секунды.
При срабатывании скрипта в период обновления папок число запросов подсчета количества записей на порядок меньше и даже при работе в приложении нескольких пользователей разницы в “отзывчивости” приложения не заметно.
Меняем в скрипте dataManager на entityManager - логин проходит буквально моментально и число запросов подсчета количества записей, отправляемых при логине падает на порядок.

Мы деактивировали единственное ограничение (на чтение, проверка в БД), которое было определено для сущности, которая обрабатывается в этих папках - картина не изменилась.
Хотя, теоретически, права пользователя на сущность и ограничения не должны влиять на количество единовременных запросов типа SELECT COUNT(ID)..., содержащихся в скрипте количества папок приложения.

С чем может быть связано подобное поведение?

Как я понимаю, скрипт количества записей выполняется при входе пользователя и по таймауту обновления папок (cсвойство cuba.web.appFoldersRefreshPeriodSec).
У нас всего порядка 20 папок приложения с разными скриптами количества.
В трех из них мы пытаемся использовать dataManager.getCount(loadContext), после чего получаем при логине сотни одинаковых запросов SELECT COUNT(ID)..., определенных в этих скриптах.

Платформа v.6.10.9

1 симпатия

DataManager.getCount выполняет один запрос через entityManager в случае если по сущности нету групп доступа с in-memory ограничениями, в противном случае начинается загрузка сущностей и применение к ним ограничений.

И второе странно, что после обновления количество запросов меняется, количество запросов всегда должно быть постоянным.

Попробуйте выполнить дебаг в com.haulmont.cuba.core.app.FoldersServiceBean#loadAppFolders и посмотреть сколько запросов выполняется на одну папку (это в случае логина).

1 симпатия

@subbotin, благодарю за подсказку.
Наши у нас проблему - не аккуратно использовали loadAppFolders при отрисовке дерева папок в SideMenu.
Кто бы раньше заглянул в код FoldersServiceBean#loadAppFolders и увидел, что метод не только читает актуальный список папок приложения, но и по-честному выполняет скрипты обновления количества.
А разница в числе одинаковых запросов для подсчета количества на стороне SQL в случае использования dataManager и entityManager, скорее всего, связана с тем, что первый всегда стартует новую транзакцию.