3.9.6. 实体统计

实体统计机制提供了数据库中当前实体实例数量的信息。此数据用于自动为关联实体选择最佳查找策略,并限制 UI 界面中显示的搜索结果的数量。

统计信息存储在 SYS_ENTITY_STATISTICS 表中,该表映射到 EntityStatistics 实体。可以使用PersistenceManagerMBean JMX bean 的 refreshStatistics() 方法自动更新。如果将实体名称作为参数传递,则将收集给定实体的统计信息,否则为所有实体收集统计信息。如果要定期更新统计信息,可以创建调用此方法的计划任务。请注意,收集数据过程将为每个实体执行 select count(*),这样会增加对数据库的压力。

可以通过中间层的 PersistenceManagerAPI 接口和客户端上的 PersistenceManagerService 来以编程方式访问实体统计信息。统计信息缓存在内存中,因此只有在服务器重启之后或在调用 PersistenceManagerMBean.flushStatisticsCache() 方法之后,对数据库中统计信息的直接更改才会生效。

EntityStatistics 有如下属性:

  • name (NAME 列) – 实体元类名称,例如 sales$Customer

  • instanceCount (INSTANCE_COUNT 列) – 实体实例的近似数量。

  • fetchUI (FETCH_UI 列) – 界面上显示的所获取实体列表的数据量。

    例如,Filter组件在 Show N rows 字段中使用此数值。

  • maxFetchUI ( MAX_FETCH_UI 列) – 允许获取并传递到客户端的实体实例的最大数量。

    在某些组件上显示实体列表时会应用此限制,这些组件包括 LookupFieldLookupPickerField 以及不带过滤器的表格,表格没有通过 CollectionDatasource.setMaxResults() 方法限制连接的数据源。在这种情况下,数据源本身将获取实例的数量限制为 maxFetchUI

  • lookupScreenThreshold ( LOOKUP_SCREEN_THRESHOLD 列) – 以实体数量衡量的阈值,确定何时应使用查找界面而不是下拉列表查找实体。

    选择过滤器参数时,过滤器组件会使用此参数。在达到阈值之前,系统使用LookupField组件,一旦超过阈值,就使用PickerField组件。因此,对于过滤器参数中的特定实体,如果想要使用查找界面,则可以将 lookupScreenThreshold 的值设置为低于 instanceCount 的值。

PersistenceManagerMBean JMX bean 能够通过 DefaultFetchUIDefaultMaxFetchUIDefaultLookupScreenThreshold 属性为上面提到的所有参数设置默认值。当实体没有统计信息时,系统将使用相应的默认值,这是一种常见情况。

此外,PersistenceManagerMBean.enterStatistics() 方法允许用户输入实体的统计数据。例如,将以下参数传递给该方法,用来将默认每页记录数设置为 1,000,并将加载到LookupField中最大实例数设置为 30,000:

entityName: sales$Customer
fetchUI: 1000
maxFetchUI: 30000

另一个示例:假设 Customer 实体具有过滤条件,并且希望在条件参数中选择 Customer 时使用查找界面而不是下拉列表。可以使用以下参数调用 enterStatistics() 方法:

entityName: sales$Customer
instanceCount: 2
lookupScreenThreshold: 1

这里忽略了数据库中的实际客户记录数,并手动指定始终超过阈值的数量。