5.9.6. Статистика сущностей
Механизм статистики сущностей предоставляет данные о текущем количестве экземпляров сущностей в базе данных. Эти данные используются для автоматического принятия решений о выборе способа поиска связанных сущностей и ограничении размера выборок в экранах пользовательского интерфейса.
Статистика хранится в таблице SYS_ENTITY_STATISTICS
, соответствующей сущности EntityStatistics
. Заполнить статистику можно как вручную, внося соответствующие записи в таблицу, так и автоматически с помощью метода refreshStatistics()
JMX-бина PersistenceManagerMBean. При указании в качестве параметра имени сущности статистика будет собрана только для данной сущности, в противном случае - для всех. Сбор статистики может занять значительное время и вызвать нежелательную нагрузку на БД, поэтому выполнять его нужно либо вручную, либо назначенным заданием в подходящее время.
Программный доступ к статистике осуществляется с помощью интерфейса PersistenceManagerAPI
на Middleware и PersistenceManagerService
на клиентском уровне. Статистика кэшируется в памяти, поэтому если изменения статистики вносятся напрямую в базу данных, для вступления их в силу необходимо перезапустить сервер или вызвать метод PersistenceManagerMBean.flushStatisticsCache()
.
Рассмотрим атрибуты EntityStatistics
и их влияние на поведение системы.
-
name
(колонкаNAME
) - тип сущности в виде имени мета-класса, например,sales$Customer
. -
instanceCount
(колонкаINSTANCE_COUNT
) - примерное текущее количество экземпляров сущности. -
fetchUI
(колонкаFETCH_UI
) - размер страницы данных, предлагаемый пользователю при извлечении списков сущностей.Например, компонент Filter устанавливает это число в поле Показывать N строк.
-
maxFetchUI
(колонкаMAX_FETCH_UI
) - максимальное количество экземпляров сущности, которое может быть извлечено и передано на клиентский уровень.Данный параметр играет роль при отображении списков сущностей в компонентах типа LookupField и LookupPickerField, а также в таблицах без универсального фильтра, то есть когда на связанный источник данных не налагается ограничений методом
CollectionDatasource.setMaxResults()
. В этом случае сам источник данных ограничивает количество извлекаемых экземпляров значениемmaxFetchUI
. -
lookupScreenThreshold
(колонкаLOOKUP_SCREEN_THRESHOLD
) - порог количества экземпляров сущности, при превышении которого в универсальных механизмах пользовательского интерфейса для поиска связанных сущностей будут использоваться экраны выбора вместо выпадающих списков.В частности, этот параметр принимается во внимание компонентом Filter при выборе параметров фильтрации: до достижения порога используется компонент LookupField, при превышении порога - компонент PickerField. Поэтому, если необходимо заставить фильтр отображать выбор параметра некоторого типа через экран выбора, достаточно внести запись статистики для этой сущности со значением
lookupScreenThreshold
меньшим, чемinstanceCount
.
JMX-бин PersistenceManagerMBean
в атрибутах DefaultFetchUI
, DefaultMaxFetchUI
, DefaultLookupScreenThreshold
позволяет задать значения вышеперечисленных параметров по умолчанию. В результате, если для некоторой сущности статистика отсутствует (что является обычной ситуацией), будет использоваться соответствующий параметр по умолчанию.
Кроме того, JMX-бин PersistenceManagerMBean
позволяет ввести данные статистики для конкретной сущности с помощью операции enterStatistics()
. Например, для того, чтобы для сущности sales$Customer
установить размер страницы данных по умолчанию в 1000, а максимальное количество извлекаемых экземпляров в компонентах LookupField в 30000, следует вызвать операцию enterStatistics()
со следующими параметрами:
entityName: sales$Customer
fetchUI: 1000
maxFetchUI: 30000
Другой пример: у вас есть фильтр с условием по сущности Customer, и вы хотите использовать экран выбора вместо выпадающего списка при выборе параметра типа Customer. Тогда вызовите метод enterStatistics()
со следующими параметрами:
entityName: sales$Customer
instanceCount: 2
lookupScreenThreshold: 1
В данном случае реальное число записей Customer в базе данных игнорируется, и явно устанавливается превышение порога.