XAF-列表视图数据访问模式
本主题介绍有关列表视图如何提供数据访问的几种方式。请注意,选择正确的方式对于实现XAF应用程序的最佳性能至关重要。
数据访问模式概述
在模型编辑器中,通过 视图-> <ListView>节点找到IModelListView.DataAccessMode属性,指定显示的对象集合是如何被访问。可用值- Client,Server,InstantFeedback和DataView。

当通过使用IModelListView.EditorType属性设置了不同的编辑器时,DataAccessMode中的值并不会隐藏掉不支持的模式。
如果您使用自定义列表编辑器,您可以通过静态方法DataAccessModeHelper.RegisterEditorSupportedModes指定支持的模式。
您可以在加载模型编辑器之前(例如,从模块的构造函数)在设计时执行的任何代码调用此方法。将列表编辑器类型及其支持的模式列表传递到此方法。默认情况下,所有模式都可用于自定义列表编辑器。
默认模式是Client,这在大多数情况下,适当的使用Server,InstantFeedback和DataView模式是提升性能问题的好方法,但它们使用不同的优化方法。下表提供了每种模式的详细说明。
|
Client: 在显示列表时,一次性的将数据库中的所有记录都读到客户端(win是客户端,web是读取web服务器内存中),不管界面上显示了多少数据,都先放到内存中去。执行排序、分组、分页、过滤,时,都是去操作内存数据。 这看起来不错吧,然后,在数据很多,关联很复杂时,一次性加载这么多会让我们感覺很慢(比如几万条),也很占内存。 |
|
Server: 假设我们使用的是sql数据库(oracle,mysql,mssql都算上),这种模式是使用sql语句进行分组、分页、排序、过滤的,这样会让数据不需要全部返回,数据多时,压力转移到sql服务器。只加载显示出来的部分,或一小部分数据,每次需要时,再去读取。数据量大时,比起client快很多。
实际使用中,遇到的较多的问题是:属性不是持久化的,不支持过滤、排序功能。可以考虑用PersistentAlias来做服务端计算表达式,用了这个之后,我们基本可以放弃要使用sql语句的功能了。 |
|
InstantFeedback: 此模式与服务器模式非常相似。所不同的是, 该数据感知操作在后台线程异步执行(16.X中的新功能),并且控制继续响应于用户的操作,而被检索到的数据(见即时反馈模式)。这就是为什么上述常规(同步)服务器模式的限制也适用于即时反馈的原因。附加限制:
|
|
DataView: 一次性加载所有的数据,但不是转换为ORM对象,返回的是数组。
|
- 您可以全局的修改所有列表视图(除了自动生成的嵌套列表视图)的数据访问方式,设置IModelOptions.DataAccessMode的属性选项节点即可。
- 所有手动创建的列表视图,包括嵌套的列表视图,默认使用IModelListView.DataAccessMode属性值。
- 在代码中创建CollectionSource并应用于ListView时,您可以使用CollectionSource.CollectionSource的构造函数中的dataAccessMode参数来指定模式。
当你定义了一个集合属性,但并没有使用Association建立关系时,你应该使用Client模式,因为,没办法推导出如何过滤这个集合。
啥意思呢,你直接在代码写了个集合属性:return new XPCollection<T>("条件");
XAF不可能使用服务端模式,因为“条件”是怎么来的,是不可以确定的,不可以自动推算出来的,比如你是动态变化的,XAF也不知是啥规则。
使用Server、InstantFeedback或DataView模式时,想显示非持久化属性时,应该用PersistentAliasAttribute或CalculatedAttribute属性。
如何选择合适的数据访问模式
服务器,InstantFeedback和数据视图模式旨在改善列表视图的性能,但应根据不同的场景。
如果数据库请求数量是关键问题时,那么就应该选择DataView模式。在此模式下,所有数据记录只请求一次,然后在客户端执行分组,排序和过滤,无需额外请求。引用类型的属性也会一次加载过来,产生的SQL就是left join。在DataView模式,只加载界面可见的列,如果理解成sql语句,则是 select a,b,c from xx ,而其他模式(Client和Server)则是加载所有的列,则是select * from xx *还有可能是更多,也会产生更多次请求,比如没有设置显示的加载引用型属性,就会再生成几次引用属性的加载。
如果列表视图启动时间非常重要,那么你应该选择Server或InstantFeedback模式。在这些模式下,只有可见的对象都被第一次请求时加载。然而,滚动、 分组、 排序和筛选导致附加的数据库请求-则是按需加载数据。
如果性能还不错,只需使用Client模式。不要启用Server,InstantFeedback或DataView,除非你发性能不能接受,或是找到了合适的模式时。务必记住本主题前面列出的限制。需要注意的是如果数据很少,Server和InstantFeedback模式并没有什么意义。
XAF-列表视图数据访问模式的更多相关文章
- Apply Grouping to List View Data 将分组应用于列表视图数据
This lesson will teach you how to apply grouping to List View data. For this purpose, you will group ...
- android数据访问模式:档、SharedPreferences
android数据访问模式:档.SharedPreferences.SQLite 数据库.Content provider 文件流: 使用java IO流对文件进行读写操作,文件权限默认. 指定文件权 ...
- 数据访问模式之Repository模式
数据访问模式之Repository模式 数据访问层无非就是对数据进行增删改查,其中增.删.改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子 ...
- 数据访问模式:Identity Map(标识映射)模式
1.Identity Map模式简介 Identity Map(标识映射)模式是通过将所有已加载对象放在一个映射中确保所有对象只被加载一次,并且在引用这些对象时使用该映射来查找对象.在处理数据并发访问 ...
- SharePoint 2010 应用url参数过滤列表视图数据(应用get办法过滤列表数据)
名人名言:读活书,活读书,读书活.——郭沫若 题目其实不知道如何称呼才干合适大师的搜刮习惯.以便有类似题目经由过程百度或google可以搜刮到,其实就是在url后面添加参数过滤显示我们想要的成果,有人 ...
- 数据访问模式:数据并发控制(Data Concurrency Control)
1.数据并发控制(Data Concurrency Control)简介 数据并发控制(Data Concurrency Control)是用来处理在同一时刻对被持久化的业务对象进行多次修改的系统.当 ...
- Make a List View Editable 使列表视图可编辑
In this lesson, you will learn how to make a List View editable. For this purpose, the DemoTask List ...
- EF3:Entity Framework三种开发模式实现数据访问
前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...
- Entity Framework:三种开发模式实现数据访问
原文地址 http://blog.csdn.net/syaguang2006/article/details/19606715 前言 Entity Framework支持Database First. ...
随机推荐
- Spring之SpringMVC(源码)启动初始化过程分析
1.说明 SpringMVC作为Spring提供的MVC实现,可以实现与Spring的天然无缝联合,因为具有很广泛的用途.具体的关于SpringMVC的处理流程逻辑我在这里就不在赘述了.还是来通过源码 ...
- POJ 1655 Balancing Act 焦点树
标题效果:鉴于一棵树.除去一个点之后,这棵树将成为一些中国联通的块.之后该点通过寻求取消最低形成块的最大数目. 思维:树DP思维.通过为每个子树尺寸的根节点深搜索确定.之后该节点然后除去,,还有剩下的 ...
- Android总结的基本机制监控事件
研究上午Android底层机制事件监视器,例如下面的摘要: 内核驱动监控硬件状态和行为,由uevent机制将事件发送到用户空间: 通过用户空间UeventObserver从内核监控uevent,处理. ...
- android的EditText获取另一个焦点
在android关于开发过程EditText在setFocusable(false);后,设置时需要再次获得输入焦点setFocusable(true);问题后仍然无法获得焦点: 解决的方法: 对Ed ...
- Mysql 使用CMD 登陆
1. 将mysql 的bin 目录加到 系统环境变量中: 这样的目的是为了可以直接在cmd中使用mysql命令,而不用先CD到mysql的bin目录中. 3. 连接目标数据库 . Syntax: ...
- css技巧--整理(1)
1.文字描边 -webkit-text-shadow:#be8ef8 2px 0 1px,#be8ef8 0 2px 1px,#be8ef8 -2px 0 1px,#be8ef8 0 -2px 1px ...
- ubuntu下java和tomcat安装配置
oracle下载jdk-7u51-linux-i586.tar.gz sudo cp Downloads/jdk-7u51-linux-i586.tar.gz /usr/local/java //拷贝 ...
- 深入分析ENode的内部实现流程和关键地方的幂等设计
ENode 2.0 - 深入分析ENode的内部实现流程和关键地方的幂等设计 前言 ENode架构图 ENode框架内部实现流程分析 Command的幂等处理 Domain Event持久化时的并发冲 ...
- OrchardNoCMS
基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--BootStrap 按照几个月之前的计划,也应该写一个使用Bootstrap作为OrchardNoCMS的UI库.之前这 ...
- 收缩SQL Server日志不是那么简单
收缩SQL Server日志不是那么简单的(翻译) 原文地址:http://rusanu.com/2012/07/27/how-to-shrink-the-sql-server-log/ 说明:本 ...