数据源
它是一个用于保存数据并将数据流式传输到客户端的基础结构。它会加快页面加载以及异步服务器结果处理的速度。基本策略是将庞大结果集连同可用于获取更多块的 ID 以块形式返回到客户端。从 UI 的角度来看,似乎在将数据流式传输到客户端。此方法与数据库分页不同,在这种情况下,我们将在数据库中保留大结果集。使用数据源时,只有客户端以块形式请求结果,结果才会留存在内存中。此外,还支持服务器在单独的线程中向数据源添加块,这样就可以请求数据源并分离线程以为其获取数据,而无需客户端等待。
使用数据源的优势如下:
• 显示数据,而无需过度消耗客户端和服务器端资源。
• 允许用户在加载数据时与页面进行交互。
• 提高感知性能。
• 在加载数据时提供消息和反馈。
数据源模式
同步:如果您已经拥有所有需要发送给客户端的数据,并且希望将数据放入数据源中以便将数据以块形式发送给客户端,那么同步非常有用。数据源会话采用您想要发送至客户端的对象列表,并返回 DataChunk 对象,其中包含要发送至客户端的第一个数据块。如果数据列表可放入一个块中,那么会话甚至不会创建数据源,而只向您返回块。否则,会创建一个内含数据的数据源,可稍后再对其进行轮询以获取其他块。此数据源将被关闭,因此无法再添加更多的数据。
异步:在这种情况下,您尚未获得数据。您需要提交一项任务才能获取后台线程中的数据,并在稍后将数据返回到客户端。我们利用由 Java 提供的 Executor 框架的功能。(有关详细信息,请参阅 Executor 的 JavaDoc) 要创建异步数据源,数据源会话将使用一个 DataSourceTask,它将在未来于某一后台线程中运行。它会返回一个 DataSourceFuture 对象,以便您可以访问数据源信息。
禁用:未启用数据源
使用数据采集的数据源
使用同步数据采集的同步数据源:使用同步数据采集 (所有数据均来自数据库中的一个块),并将块流式传输到客户端。不会发送空白块,因此,直到接收到第一个数据块后才会呈现组件。目前,我们不支持对树组件执行此操作。
使用同步数据采集的异步数据源:使用同步数据采集 (所有数据均来自数据库中的一个块),并将块流式传输到客户端。发送至客户端的第一个块不包含任何表数据,但允许在完整数据块可用之前呈现表格。这样,用户就可以更快地控制表格及其某些操作。然后,数据块将在经过处理的空白块之后进行流式传输。
使用异步数据采集的异步数据源:使用异步数据采集 (数据来自数据库中的多个块),并将块流式传输到客户端。发送至客户端的第一个块不包含任何表数据,但允许在完整数据块可用之前呈现表格。这样,用户就可以更快地控制表格及其某些操作。然后,数据块将在经过处理的空白块之后进行流式传输。 在这种情况下,当仍从数据库获取数据时,我们可能会看到在客户端中呈现的数据块。
对于树,加载行为会有所变化。在 Windchill 9.x 中,我们遵循的是深度优先加载方法,每个节点在其叶节点之前展开,然后开始展开其同级节点。在 Windchill 10 中,使用数据源后,我们转变为遵循广度优先加载方法。节点是按级别加载的。
监控数据源
DataSourceMonitor MBean 可用于监控和配置各种特性。要查找监视器:
• 从 windchill shell 中,运行 "jconsole"
• 选择 MethodServerMain
• 选择 Mbean 选项卡
• MBean 位于 com.ptc>WebAppContexts>${WEBAPP_NAME}>Monitors>DataSourceMonitor
MBean 监控
参数 | 说明 |
ActiveDataSourceCount | 当前在所有用户会话中处于活动状态的数据源的数量 |
TotalDataSourcesCreated | 已为所有用户会话创建的数据源总数 |
TotalDataSourcesDestroyed | 已针对所有用户会话销毁的数据源总数 |
MBean 操作
参数 | 说明 |
cancelLongRunningDataSources | 在所有用户会话中,取消至少在给定的毫秒数内运行的全部数据源。这会同时取消活动数据源和非活动数据源 |
MBean 配置
参数 | 说明 |
AllEmptyPollingTimeout | 当客户端轮询块且请求的 id 都没有可用的块时等待数据块的超时时间 (毫秒)。 |
ChunkBlockingLimit | 控制数据源在其阻止添加更多项直至轮询或超时为止之前可以保留的块的数量。由此解析为的实际项数为 ChunkBlockingLimit*MaxChunkSize。 |
DataSourceTaskPoolKeepAliveTime | 在 DataSource 任务池中保持空闲线程处于活动状态的时间量 (毫秒)。 |
DataSourceTaskPoolSize | 数据源任务池中允许的最大线程数。 |
DataSourceTimeout | 保持空闲数据源处于活动状态的时间量 (毫秒)。 |
FeedbackBlockingLimit | 数据源在其阻止添加更多反馈直至轮询或超时为止之前可以保留的反馈项的数量。 |
InitialChunkPollingTimeout | 使用异步数据源时等待可用初始数据块的时间量 (毫秒)。这样,组件可在初始呈现时尝试显示表格中的某些数据。 |
MaxPollSize | 数据源为每次轮询返回的最大值。 |
PreferredMinPollSize | 轮询的数据的最小大小。轮询异步数据源时使用此参数,以允许服务器决定是否等待更多数据。 |
PreferredSerializationSize | 轮询请求总响应的首选大小 (字节)。如果初始块达不到此大小限制,则会添加附加的块,直至超出限制。目前尚未使用该特性。 |
ResultLimit | 在数据源失效之前可添加到其中的项的总数。 |
SomeEmptyPollingTimeout | 当客户端轮询块且请求的某些而非全部 id 存在可用的块时等待数据块的超时时间 (毫秒)。 |
TreeChildNodeFetchTimeout | 等待树的子数据的超时时间 (毫秒)。预设值为 180000 毫秒,但可适当增加,以免发生超时错误。 |
保留更新的 MBean 配置值
可以在 XML 中保留 "DataSourceMonotor" MBean 的已更新配置值。
• 打开 JConsole 并更改 "DataSourceMonitor" MBean 的任何可配置值。
• 单击 "DataSourceMonitor" MBean。在 MBeanInfo 中,复制 "ObjectName"。
• 打开 Loader MBean com.ptc > WebAppContexts >${WEBAPP_NAME}
• 转到其 "Operation invocation" 选项卡。
• 将 "ObjectName" 粘贴为 ""addInjectionTargetMBean" 方法的参数,然后单击 "addInjectionTargetMBean" 按钮。
• 现在,单击 "Save" 按钮。"DataSourceMonitor" MBean 的更改值将保留在 <WTHome>\codebase\WEB-INF\wtWebAppMBeans.xml 文件中。在后续重启服务器时,上次保存的值会显示在 "DataSourceMonitor" MBean 中。
• 通过使用 "ObjectName" 调用 "removeInjectionTargetMBean" 方法,然后执行 "save" 操作,可将可配置特性恢复为默认值。
性能问题
• 每个组件的线程数
除了使用 MBean 特性来调整不同的大小和超时时间外,特性 numberOfThreadsPerComponent 还可以影响组件的整体性能。此特性用于修改任何组件所允许的最大线程数,以通过数据实用程序处理数据库中的数据。这些线程处理 RawDataChunkSize MBean 值大小的数据,且有效期较短。增大数值不太可能会提供进一步的帮助,因为数据库中数据的运行速度不够快,不需要更多线程。在大多数情况下,并发运行的最大线程计数为两个。如下所示为显示默认值的特性的示例:com.ptc.core.components.factory.dataUtilities.numberOfThreadsPerComponent=3
• WAN 客户端和 MaxPollSize
对于 WAN 客户端,将 maxPollSize 属性设置为更大的数字,运行效果可能会更好一些。值越小,LAN 客户端的运行速度就会越快,因为发出请求的延迟惩罚会越小。如设置为 500 这一均衡值,则同时适用于上述两种情况。客户端浏览器应使用多个 Ajax 请求来下载数据。由于数据的获取速度并没有更快,更多的请求也不会提高下载速度,因此,这种情况被限制为三个并发请求。在这种情况下,此特性不可配置 (PTC.jca.DataSourceRegistry.MAX_REQUESTS)。