简介
本文概述了性能问题和优化应用程序性能的Mendix最佳实践。
最佳性能
当一个对象具有计算属性时,每次更改该对象或从存储器中检索该对象时,都会通过调用MicroFlow来计算其计算属性。如果计算属性后面的逻辑检索其他对象或执行集成活动,则会导致额外的负载和延迟,而不使用逻辑的结果。创建计算属性总是会影响性能,因此您需要评估是否有必要使用它们。
在大多数情况下,当使用对象时,总是执行计算属性背后的逻辑。每当检索活动没有检索模式时(数据网格就是这种情况),就会执行它。计算属性背后的逻辑在以下元素中执行:
-
检索和更改MicroFlow中的对象活动;
-
在UIwidgets中(例如,数据视图、自定义widgets);
-
当一个对象作为参数从UI传递到MicroFlow时(例如,触发MicroFlow的按钮)。
计算属性有两个不同的性能问题,您可以轻松解决:
-
在页面上使用计算属性时
-
当存在未使用的计算属性时
01. 避免在页面上使用计算属性
检索活动触发计算属性的逻辑,这可能导致执行数据库操作和MicroFlow调用(对象通过计算属性相互检索)。
如果页面上的数据widgets(列表视图、数据视图或数据网格)使用计算属性,这可能会影响加载和显示页面的时间。
修复步骤
要解决此问题,请执行以下操作:
-
在域模型中,更改要存储而不是计算的属性。
-
无论属性将要提交到数据库的何处,都要使用相关的MicroFlow计算值。
当属性更改为存储时,数据库将只包含该数据类型的默认值,因此您需要迁移任何现有数据。
02. 删除未使用的计算属性
当检索活动触发计算属性的逻辑时,它可能导致数据库操作和MicroFlow调用(对象通过计算属性相互检索)的执行链。
如果不使用计算属性,则可以安全地删除这些属性,以避免重复的MicroFlow调用。
修复步骤
要解决此问题,请删除未使用的计算属性。
为排序栏中的属性添加索引
排序栏用于对数据widgets中的项进行排序。排序栏可用于三种不同类型的数据widgets:
-
数据网格
-
模板网格
-
参考集选择器
排序栏中的每个排序项依次用于对widgets中的数据进行排序。在排序项中使用的属性上添加索引可以加快排序过程,从而提高页面的性能。
在一个实体上可以执行四个操作:创建、更新、删除和选择。创建、更新和删除操作的数量远远大于选择操作的数量的实体可以称为写密集型实体。大多数操作都会改变数据库中的数据,而不是从中进行选择。
选择操作的数量远远大于创建、更新和删除操作的数量的实体可以称为读密集型实体,大多数操作从数据库中选择数据。仅对属于主要是读密集型实体的属性执行此优化非常重要。
由于完全不同的最佳实践适用于读密集型和写密集型实体,因此根据在实体上执行的操作类型来区分实体是很有价值的。
修复步骤
若要解决此问题,请在用作页面排序栏中排序项的属性上添加索引。
避免在带有Create Object、Change Object或Commit活动的循环中提交对象
在MicroFlow中,Mendix对象可以通过三个活动持久化到数据库:Create object活动、Change object活动和Commit活动。对于在循环中创建或更改的对象,在循环中立即提交它们不是最佳做法,因为这样会带来不必要的性能开销。相反,建议对多个创建/更改的对象执行批提交,提交活动在循环之外,以减少数据库、应用程序和网络开销。
与单个提交相比,提交对象列表具有以下优点:
-
准备好的在数据库中创建或修改记录的语句被JDBC驱动程序显式重用,并具有以下好处:
-
执行计划被缓存
-
驱动程序关心最小的网络开销
-
-
对于每个更改数据的数据库操作,将执行以下操作并增加开销:
-
保存点在操作之前创建,之后释放
-
从数据库检索自动提交的对象
-
自动提交的对象存储到数据库(如果相关)
-
创建或更改对象活动的修复步骤
要解决循环内创建或更改对象活动的问题,请执行以下操作:
-
将“创建/更改对象”活动的“提交”选项从“否”更改为“确定已创建/更改的对象在列表中可用”。
-
当迭代完成或列表中的对象数达到1000时,在循环后提交列表,以避免过多的内存使用。
提交活动的修复步骤
要解决提交活动的问题,请在循环完成后或列表中的对象数达到1000时提交列表,以避免过度使用内存。
将合格的MicroFlow转化为NanoFlow
因为NanoFlow可以直接在终端用户的设备或浏览器上执行,所以它们非常适合脱机使用。相反,MicroFlow在运行时服务器中运行,从而涉及到网络流量的使用。将符合条件的MicroFlow转换为NanoFlow有助于避免通过网络进行通信,并显著提高应用程序的性能。
您可以使用以下标准识别可转换MicroFlow:
-
具有以下一个或多个类别的MicroFlow:
-
MicroFlow具有用于离线应用程序的逻辑。
-
MicroFlow具有用于在线应用程序的逻辑,但不涉及任何与数据库相关的操作,如提交创建对象、提交、检索和回滚活动。
-
MicroFlow最多有一个与数据库相关的操作。(不是最佳实践)
-
-
包含NanoFlow兼容活动的MicroFlow。
-
MicroFlow表达式不包含以下变量:$latestSoapFault,$latestHttpResponse,$currentSession,$currentUser,$currentDeviceType。NanoFlow不支持这些变量。
-
由于NanoFlow是在当前用户的上下文中执行的,因此请确保MicroFlow只有当前用户授权的操作。否则转换的NanoFlow将失败。
修复步骤
要解决此问题,请执行以下操作:
-
右键单击模块并选择Add nanoflow,创建一个新的nanoflow。
-
从MicroFlow中复制相同的逻辑。新的NanoFlow看起来必须和MicroFlow几乎一样。
-
通过右键单击MicroFlow并选择“查找用法”来检查MicroFlow的用法。用新创建的nanoflow替换所有用法。
-
删除未使用的MicroFlow。您可以通过选择MicroFlow并按Delete或右键单击它并选择Delete来执行此操作。
为XPath表达式中使用的属性添加索引
XPath表达式可能需要很长时间才能运行,具体取决于底层实体包含的记录数。对于读密集型实体,在XPath表达式中使用的属性上添加索引,就能显著提高从数据库中检索对象的性能。XPath表达式也可以通过对它们进行排序来优化,使第一个类排除尽可能多的项,可以通过在表达式的前面使用索引属性来实现。这将使要加入/筛选的其余数据集尽可能小,并减少数据库的负载。
请注意,XPath表达式可以在三个不同的位置使用:
-
访问规则和实体
-
页面上列表和网格的源/筛选器
-
检索MicroFlow和Java操作中的操作
修复步骤
要解决此问题,请执行以下操作:
-
在添加索引之前,检查基础实体是否包含大量记录(至少10000条记录)。
-
为XPath表达式中使用的每个属性添加一个索引,仅适用于读密集型操作主要在底层实体上执行的场景。
这种优化可能对布尔和枚举之类的数据类型不太有利。因为这些类型的可能值数量有限,不建议为此类类型添加索引。
避免缓存不可持久的实体
不可持久对象是被认为是临时的并且只存在于内存中的对象。它是不可持久实体的实例。因为这些对象只存在于内存中,所以无需缓存它们。一方面,创建非持久实体与系统会话或者系统用户持久实体。另一方面,缓存不经常更改但在逻辑中经常使用的对象非常重要。持久化实体可以连接到系统会话作为结果的缓存,这将有助于避免数据库通信的开销。
您可以使用以下准则来决定是否需要缓存:
-
数据不会经常更改
-
经常读取数据
-
数据量有限(通常少于10000条记录)
-
使用过时数据的影响是可以接受的
修复步骤
要解决此问题,请执行以下操作:
-
对于不经常更改的实体,如果它的对象经常用于逻辑,则使其持久化。
-
如果不满足上述条件,请删除非持久化实体与的关联系统用户或者系统会话。
更多信息,请访问以下链接:
Mendix官网:https://www.mendix.com/zh/
Mendix中国论坛:https://forum.mendix.tencent-cloud.com/
Mendix行业解决方案:https://solutions.mendix.com/
Mendix平台指南:https://www.mendix.com/evaluation-guide/
Mendix动画展示:https://www.mendix.com/demos/
感谢阅读!