目录

  • 1. 简介
  • 2. 计算属性的最佳实践[MXP001][MXP002]
    • 2.1 在页面中避免使用计算属性[MXP001]
      • 2.1.1 修复步骤
    • 2.2 删除未使用的计算属性[MXP002]
      • 2.2.1 修复步骤
  • 3. 为排序栏中的属性添加索引[MXP003]
    • 3.1 修复步骤
  • 4. 避免在循环中创建对象、修改对象或提交活动时提交对象[MXP004][MXP005]
    • 4.1 创建或修改对象活动的修复步骤[MXP004]
    • 4.2 提交活动的修复步骤[MXP005]
  • 5. 将符合条件的微流转化成纳流[MXP006]
    • 5.1 修复步骤
  • 6. 为用在XPath表达式中的属性添加索引[MXP007]
    • 6.1 修复步骤
  • 7. 避免缓存非持久化实体[MXP008]
    • 7.1 修复步骤
  • 8. 避免使用多级继承[MXP009]
    • 8.1 修复步骤
  • 9. 重复的访问规则[MXP010]
  • 9.1 修复步骤
  • 10. 避免深度的嵌套列表视图[MXP011]
    • 10.1 修复步骤
  • 11. 避免重复提交变量[MXP012]
    • 11.1 修复步骤
  • 12. 否定的XPath实体访问规则[MXP013]
    • 12.1 修复步骤
  • 13. 将创建/修改/删除活动放在微流的结束事件附近[MXP014]
    • 13.1 修复步骤
  • 14. 对XPath取和部分的排序:最廉价和最具体的优先[MXP015]
    • 14.1 修复步骤

1. 简介

本文概述了Mendix应用的性能问题及Mendix应用性能优化的最佳实践。

2. 计算属性的最佳实践[MXP001][MXP002]

如果对象有计算属性,每次对象从存储中修改或者检索,通过调用微流都会对计算属性进行计算。如果不使用逻辑的结果同时计算属性背后的逻辑又取回其他对象或者执行集成活动,则会导致额外的负载(和延迟)。创建计算属性通常影响性能,因此必须评估是否有必要使用。关于属性更多信息,请参考Attributes。

在多数情况下,计算属性背后的逻辑总是在使用对象时进行执行。只要检索活动没有检索模式(表格(data grid)就是这种情况),就会执行。计算属性背后的逻辑在以下元素中执行:

  • 微流中检索和修改对象的活动。
  • 在UI组件中(例如,data view或自定义组件)
  • 对象从UI中作为参数传递给微流(例如,按钮触发微流)

计算属性导致两种不同的性能问题可被修复:

  1. 在页面中使用计算属性
  2. 有未使用的计算属性

2.1 在页面中避免使用计算属性[MXP001]

检索活动触发计算属性的逻辑,导致数据库的操作和微流的调用被执行(对象通过计算属性相互检索)。

如果页面中的数据容器(list view,data view或者data grid)使用计算属性,将影响加载的时间和页面显示的时间。

2.1.1 修复步骤

为解决此问题,参考以下步骤:

  1. 在领域模型中,将计算属性改为存储属性。
  2. 在该属性提交到数据库时,使用相关微流计算该属性值。

由于该属性改为存储属性,数据库仅包含该数据类型的缺省值,可能需要迁移已有的数据。

2.2 删除未使用的计算属性[MXP002]

检索活动触发计算属性的逻辑,导致数据库的操作和微流的调用被执行(对象通过计算属性相互检索)。

如果计算属性未被使用,为避免多余的微流调用可以将它们安全的删除。

2.2.1 修复步骤

删除未用的计算属性。

3. 为排序栏中的属性添加索引[MXP003]

排序栏用于对数据容器中的数据项进行排序。排序栏可用在三种不同的数据容器中:

  • Data grid
  • Template grid
  • Reference set selector

在排序栏中的每个排序项依次用来对组件中的数据进行排序。为排序项所用的属性添加索引可使排序过程更加迅速,从而提高页面的性能。

对于实体有四种操作:创建、修改、删除和查询。创建、修改、删除操作的数量多于查询操作的数量称为写密集,因为此种情况下大多数操作会改变数据库中的数据,而不是从中选择;查询操作的数量多于创建、修改、删除操作的数量称为读密集,因为大多数操作都是从数据库中选择数据。优化时,重要的是仅对属于读密集的实体属性进行优化。

由于读密集和写密集的优化完全不同,因此通过对实体操作类型的区分十分有价值。

3.1 修复步骤

为页面中排序栏中用作排序的属性添加索引。

4. 避免在循环中创建对象、修改对象或提交活动时提交对象[MXP004][MXP005]

在微流中,Mendix对象用作数据库持续化有三种活动:Create Object活动、Change Object活动和Commit活动。对于在循环中创建和修改对象,最好不要在循环中立即进行提交,这样将导致不必要的性能负担。相反,推荐的做法是在循环外执行创建/修改对象批量提交,来减轻数据库、应用和网络负担。

相比于单个提交,批量提交有以下优势:

  • 创建或修改数据库记录的prepared语句明显重用了JDBC驱动并有以下优点:

    • 执行计划被缓存
    • 驱动最小化网络负载
  • 对于每个修改数据的数据库操作,以下发生操作并增加额外的开销:
    • 在操作执行前创建savepoint,并在后续释放
    • 从数据库取回自动提交的对象
    • 将自动提交的对象存储到数据库(如果相关)

4.1 创建或修改对象活动的修复步骤[MXP004]

为修复在循环中创建和修改的问题,参考以下步骤:

  1. Create/Change对象活动的Commit选项从No更改,并确保所创建/修改的对象在列表中可用。
  2. 在遍历结束后或者列表中的对象数量达到1000时,在循环后提交列表,以免使用过多的内存。

4.2 提交活动的修复步骤[MXP005]

要解决Commit活动的问题,在遍历结束后或者列表中的对象数量达到1000时,在循环后提交列表,以免使用过多的内存。

5. 将符合条件的微流转化成纳流[MXP006]

纳流直接在最终用户的设备或浏览器中执行。这使它们成为离线使用的理想选择。相反,微流运行在运行时服务器中,因此涉及网络流量的使用。将符合条件的微流转化为纳流,有助于减少网络通信并显著提高应用的性能。如何使用纳流更多的请参考Nanoflow。

满足以下条件的微流可转化为纳流:

  • 具有有一个或多个类别的微流:
  • 微流具有离线应用的逻辑
  • 微流具有在线应用的逻辑,但不包括数据库相关的操作如提交Create objectCommitRetrieveRollback活动。
  • 微流最多只有一个数据库相关的操作。(不是最佳实践)
  • 微流包含纳流相兼容的活动。对于纳流支持的活动,更多地请参阅Activities
  • 微流表达式不包含以下变量:$latestSoapFault, $latestHttpResponse, $currentSession, $currentUser, $currentDeviceType。纳流不支持这些变量。
  • 因为纳流在当前用户的上下文环境执行,请确保微流仅有当前用户有权进行的操作。否则,不能转化为纳流。

安全:微流在服务器端执行,对于安全是容易的。如果安全是应用关心重要因素,在决定将微流转化为纳流时应注意这一点。

5.1 修复步骤

参考以下步骤:

  1. 右键模块并选择"Add nanoflow"来创建新的纳流。
  2. 复制微流中同样的逻辑。新的纳流必须看起来和微流相似。
  3. 通过右键微流并选择"Find usages"检查微流的使用情况。以新建的纳流替换所用之处。
  4. 删除未用的微流。可以通过选择微流并按"Delete"键或右键再选择Delete

6. 为用在XPath表达式中的属性添加索引[MXP007]

XPath表达式可能需要很长时间才能运行,具体取决于底层实体包含的记录数。对于读取密集型实体,为XPath表达式中使用的属性上添加索引是有意义的。这可以显着提高从数据库中检索对象的性能。 XPath表达式也可以通过以第一类排除尽可能多的项目的方式对它们进行排序来优化。这可以通过在表达式的前面使用索引属性来实现。这将使要加入/过滤的其余数据集尽可能小,并减少数据库的负载。

注意,XPath可用在以下三处:

  1. 访问规则和实体。
  2. 页面中列表和表格的数据源和过滤器。
  3. 微流或Java action中的检索操作。

6.1 修复步骤

参考以下步骤:

  1. 在添加索引前,检查基础实体是否包含大量的数据(至少10000条记录)。
  2. 对于XPath表达式中使用的每个属性添加索引,仅适用于在底层实体上执行读密集操作的场景。

7. 避免缓存非持久化实体[MXP008]

非持久化对象被认为是临时的并只存在内存中。它是非持续实体的实例。关于持续化和非持续化实体,请参阅Persistablity。由于这些对象仅存在在内存中,对它们进行缓存是无用的。一方面,在System.Session或System.User中创建非持续化实体的关系是多余的。另一方面,缓存不经常修改并被逻辑频繁使用的对象是重要的。这将有助于避免数据库通讯的负担。可持续化的实体可与用户的System.Session相连接,可被用作结果的缓存。关于对象和缓存更多的信息,请参阅Objects and Caching。

可使用以下指南来决定是否需要缓存:

  • 数据不经常发生改变
  • 数据经常被读取
  • 数据卷是有限的(通常少于10000条记录)
  • 使用陈旧的数据的影响是可接受的

7.1 修复步骤

参考以下步骤:

  1. 对于不经常发生改变的实体,如果在逻辑中被频繁地使用,应该将其持续化
  2. 如果上述条件不满足,请删除与System.User或System.Session相关联的非持续化实体关系。

8. 避免使用多级继承[MXP009]

对于实体使用多级继承和太多的特化,可能会影响大型数据集的性能,尤其是当将 XPath 用于实体访问规则时。这会生成复杂的查询,为每个专业化访问规则添加 XPath,并导致查询缓慢。

8.1 修复步骤

如果使用XPath作为实体访问规则,对实体不使用多于两级的继承或者过度使用特化。

请考虑一下替换方法:

  1. 在一个实体中组合属性并添加一个枚举类型而不是设置泛化
  2. 创建实体的一对一关联而不是设置泛化
  3. 创建一个继承自业务逻辑结果的非持久化实体

9. 重复的访问规则[MXP010]

对实体使用重复的访问规则会影响性能,尤其是当您将 XPath 用于实体访问规则时。这会生成复杂的查询,为每个专业化访问规则添加 XPath,并导致对大型数据集的查询缓慢。

9.1 修复步骤

要解决此问题,建议重新访问安全规则并避免让安全模型驱动流程规则(安全引擎未针对流程任务分配进行优化)。参考以下步骤:

  • 合并在规则中的变化,在微流中添加额外的检查以验证状态更改,而不是让访问规则中的所有变化
  • 考虑将实体拆分为具有一对一关联的多个实体。在这些单独的实体上,可以简化访问配置文件并可能限制对整个实体的访问,而不是几十个单独的字段。

10. 避免深度的嵌套列表视图[MXP011]

列表视图用于嵌套两个或多个级别的页面,例如,列表视图在列表视图中,第二个列表视图在数据视图中。当使用两个或更多级别的嵌套时,由于请求数量和传输的数据量增加,页面性能可能会受到影响。

10.1 修复步骤

请考虑重组当前页面并添加新页面。例如,可以添加一个弹出页面。

11. 避免重复提交变量[MXP012]

具有重复提交变量的微流可能会导致运行时间更长的事务,这可能会影响性能。

11.1 修复步骤

重构微流,使变量在微流中只提交一次。

12. 否定的XPath实体访问规则[MXP013]

具有大量数据和相互否定的访问规则的实体可能会导致性能问题。

如果两个访问规则仅在否定上有所不同,可以尝试删除否定规则(包含not()= false()的规则)。

12.1 修复步骤

量避免否定 XPath 规则。否则,如果有大量对象,应用程序可能需要数据库调整。

13. 将创建/修改/删除活动放在微流的结束事件附近[MXP014]

带有创建/更新/删除活动的微流太靠近启动事件可能会导致数据库比必要时间更早地获取锁或资源。这可能会影响应用程序性能。

13.1 修复步骤

重构微流,使创建/更新/删除活动更接近微流的结束事件。

14. 对XPath取和部分的排序:最廉价和最具体的优先[MXP015]

如果 XPath 表达式在and左侧或谓词部分序列左侧(如[part 1][part 2] )具有更昂贵或不太具体的部分,可能会影响应用程序性能。

根据数据量(100,000 项或更多)和应用程序使用情况,函数not()contains(unlimited-string-attribute)not(association)最好放在and关键字的右侧。

此外,对于数百万个项目的数据量,首先放置更具体的 XPath 步骤可能意味着数据库的整体工作更少。 “具体”是指涉及多少关联步骤。例如,使用关联的 XPath 部件比直接访问属性的 XPath 部件更具体。

14.1 修复步骤

新排列 XPath 的各个部分,以便最便宜和最具体的部分位于每个and的左侧。同样,如果使用像[part 1][part 2]这样的单独谓词,可以重新排列谓词以获得最佳顺序。

Mendix性能最佳实践相关推荐

  1. java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化

    数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...

  2. 持续集成最佳实践_集成服务性能最佳实践–数据流优化

    持续集成最佳实践 In this article, we'll present a couple of common best practices regarding the performance ...

  3. integration_Integration Services性能最佳实践–写目标

    integration With this article, we continue part 1 of common best practices to optimize the performan ...

  4. RocketMQ中高性能最佳实践-网易云课笔记

    RocketMQ中高性能最佳实践 最佳实践之Producer 降低服务器管理的复杂性和管理成本 最佳实践之Consumer 最佳实践之NameServer JVM与Linux内核配置 JVM配置 Li ...

  5. Mendix UX最佳实践

    简介 在Mendix团队中,用户体验设计师的工作是通过各种方式来改善应用程序的用户体验.然而,有时从开发角度出发,逻辑解决方案对用户体验的改善并非是最佳解决方案.因此,本篇内容将提供用户体验设计师一些 ...

  6. C# DataSet性能最佳实践

    C# 性能优化细节 1.使用ItemArray实现对DataRow的批量赋值 在对DataRow的所有字段赋值时,使用字段名进行逐列赋值效率较低.这时应尽量使用批量字段赋值.可以使用ItemArray ...

  7. 15年双11手淘 H5性能最佳实践

    2015年是全面『无线化』的一年,在BAT(财报)几家公司都已经超过50%的流量来自移动端,这次 双11 更是占到了68.67%无线交易 (天猫微博). 手淘中大量的业务采用H5的方式开发,H5体验好 ...

  8. 15年双11手淘前端技术巡演 - H5性能最佳实践(转载,好文)

    转载:原文链接 前言 2015年是全面『无线化』的一年,在BAT(财报)几家公司都已经超过50%的流量来自移动端,这次 双11 更是占到了68.67%无线交易 (天猫微博). 手淘中大量的业务采用H5 ...

  9. ASP.NET Core 性能优化最佳实践

    本文提供了 ASP.NET Core 的性能最佳实践指南. 译文原文地址:https://docs.microsoft.com/en-us/aspnet/core/performance/perfor ...

最新文章

  1. DES加密算法安全性评估
  2. C# 继承实现父类方法、重写、重载
  3. Windows下使用apache模块实现合并多个js、css提高网页加载速度
  4. springboot+多线程简单实现
  5. HD2500显卡驱动linux,Intel发布HD Graphics 2500/4000显卡Win10驱动下载
  6. Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by
  7. Linux 命令(84)—— id 命令
  8. nginx实现动态分离,解决css和js等图片加载问题
  9. 构建大数据网络 你不得不重视的六个问题
  10. HBuilde H5开发,关于JSON的Storage存储
  11. AppBox v6.0中实现子页面和父页面的复杂交互
  12. QPushButton设置背景图片变换(素材四连图)
  13. 虚拟机vmware设置nat模式上网
  14. bios设置raid启动模式Linux,RAID BIOS检测硬盘以及设置RAID模式
  15. 数字孪生技术在交通运输领域管理应用【案例解析】
  16. C-关键字之const
  17. 霍元甲被日本人用烂肺药毒死(图)
  18. AE2022 for Mac安装包+安装教程
  19. PC上测试移动端网站和模拟手机浏览器
  20. 【复变函数与积分变换】05. 留数

热门文章

  1. 双路高速 AD 实验
  2. grant on mysql_MySQL的GRANT命令(创建用户)
  3. 基于springboot小区共享车位平台的设计与实现
  4. 【maven】help插件
  5. Face Model Compression by Distilling Knowledge from Neurons论文初读
  6. MDR外接设备的接线方式
  7. 服务器部署rz/sz
  8. CentOS7命令行安装rz,sz详解
  9. 三菱modbusRTU通讯实例_基础知识 | 三菱FX3U4AD模拟量输入模块
  10. 多个网站共用一个服务器权重,一个服务器多个站点会不会分散权重