当你还在纠结于ORM的性能时,我已经远远的把你抛在脑后
最近找工作面试,问到一些过去的工作和项目经验。我把公司用到的ORM框架(LLBL Gen)拿出来谈一谈,说一下他的优势,对方却一直追问ORM的好处,性能方面的问题,让我有时候都不知道如何回答,产生了不小的压力。
坦白来说,自学生时代(2004)就对NHibernate的大名敬仰已久,也完整的学习过它的映射文件写法,数据读取方法,当时对复杂的Xml映射配置文件了熟于胸。那时,微软的Application Block还比较流行,这项技术演变为后来的Enterprise Library,在第二份工作,我可以参与技术选型时,毫不犹豫的选择了Enterprise Library。再配合一个实体代码生成工具,工作中的技术需求都可以应对。再接下来的一份工作,选择ORM数据访问,再应用一些熟悉的技术,一下子对整个MIS类型项目的开发设计有了更基础层面的理解。如果需要了解,请参考
Enterprise Solution 2.2 开发帮助文档集合
ORM到底有什么好处,以我的理解有以下三点
1 强类型的对象 界面和业务逻辑层以实体对象来作为传输格式,编译器在编译时就可以辅助帮忙检查类型错误,而不需要等到运行时。
2 借助于数据绑定技术,业务逻辑层与界面层完全分离。ASP.NET MVC现在是教导你强制分离,并且创建好了基础结构,只需要遵循它的开发模式,即可开发出界面与逻辑分离的程序。但在WinForm时代,我承认,在之前,我是用很原始的方式,在窗体加载(OnLoad)时把数据绑定到控件,在点击按钮执行动作时,再从控件读取数据,传到逻辑计算方法中。强类型配合数据绑定技术,在界面加载时,传递一个entity到界面中,在执行动作时,获取数据源中的entity,可以节省大量的代码。
3 可扩展性,可维护性增强。如果有数据库字段修改,因为传递的是entity对象,数据访问接口不需要做任何修改,而界面中只需要把相关的字段绑定到控件中即可。MIS类型的项目,表格或字段的增加与减少是常有的事,而需要做的就是重新生成一次实体定义代码,绑定字段到界面中,增加需要的计算逻辑即可。
因为ORM框架会自带一些基础的类型(元数据)和数据访问方法,因而还可以做出很多基础性的工作。举例如下:
1 插件式系统的功能管理。管理基础的模块和功能。
2 定义一套权限结构。用户管理,用户组别管理,模块权限,功能权限,具体的数据字段权限与业务绑定。
3 定义一套查询框架。MIS类型的系统,在系统提供基础查询的基础上,要让用户可以自定义查询。在这点上,只需要获取ORM的entity与数据库中的table映射关系,放到基础的查询表中,再依照此实体,反射它的属性成员供用户选取查询,最后生成一个查询表达式,运行时转化成SQL语句从数据库中读取数据。
4 定义一套报表框架。因为报表是经常会发生变化的。报表的布局,参数,数据来源,计算逻辑都会依照实际的需求产生一些变化。程序员需要将报表开发中,不会改变的地方独立出去,做成一个公共模块,供报表开发人员调用。这一块内容,我做到了将用户输入值与与报表参数动态绑定。
5 导航设计工具。MIS项目如果要满足用户自定义菜单,导航功能的需求,则需要实现一套菜单结构定义。存储的格式为Xml或是数据库,在运行时,依据定义生成界面中的菜单和导航,增加灵活性。
6 工作流绑定。因为强类型的entity,它的create,delete,update动作都可以通过读取元数据得知,包括属性值的变更,以反射的方式读取。可以截获特定的值改变事件,比如采购单批准(approved)这个值设为yes,激活工作流,自动生成一些数据通知或查询结果,发送到指定的负责人。
性能层面,ORM肯定不及原生的ADO.NET,映射转换从entity到table都需要消耗一定的时间。经过优化的ORM查询,性能损失不比ADO.NET慢很多,但是得到的好处是易于维护,以及因此而带来的一系列的技术提升,前提是你不仅仅把ORM拿来做数据访问,还研究它的元数据结构,与数据绑定技术的融合等技术。
四年以前开发MIS类型的项目,从创建数据表开始,再借助于代码生成器,生成实体和数据访问代码,再到逻辑层开发。在经历上一份工作之后,经过这几年的积累,我也做到了快速开发,不过这次的格调也高很多。用企业架构模式中的话来说,前一种是事务脚本(transaction script),后一种是领域模式(domain model)。
最后写两句话与大家共勉励:
1 适合完成项目的技术是最好的技术,一味追求技术更新会给项目带来风险。
2 当你在习惯于一种开发模式后,在有精力或是项目允许的情况下,可以考虑尝试另一种技术路线。
当你还在纠结于ORM的性能时,我已经远远的把你抛在脑后的更多相关文章
- 测试Data ORM的性能
闲着无聊,测试了一下公司ORM的性能,和其它的ORM相比,该有的都有了,不该有的也勉强塞了进去,总体考虑是并发与扩展性问题,譬如读写分离,消息总线服务整合,缓存内置. 测试机是I7,16G内存,这里只 ...
- 还在纠结 Flux 或 Relay,或许 Redux 更适合你
重磅消息,Redux 1.0 发布,终于可以放心用于生产环境了! 在这个端应用技术膨胀的时代,每天都有一大堆框架冒出,号称解决了 XYZ 等一系列牛 X 的问题,然后过一段时间就不被提起了.但开发的应 ...
- 还在纠结注册.com域名还是.cn域名?
一.概念 .com域名,国际最广泛流行的通用域名格式.国际化公司都会注册. .com域名:当然也可以选择.net/.org以.com为结尾的国际域名. 例如表示工商企业的 .com. 同时还有 .ne ...
- 还在纠结学什么编程语言吗?Python可能会“教”你做人
这几年为什么Python在中国就火起来了? Python这个东西国,大概是从2017年末开始,突然就火了起来的.此前,对于Python,乃至编程,绝大多数程度上都是专业人士的话题,在普通大众层面上起不 ...
- 阮一峰大神的快排?刚才还在纠结sort()的我!真是个小傻瓜
看到这个标题之后 我毫不犹豫的点进去了 趁现在不忙我赶紧把代码写到了我的小本本上好好研究研究 (写的就不放进来了 有点丑) 研究了下 第一反应 明明能用sort()解决的 为什么非要写这么一大串 但 ...
- 对posintion属性的简单认识,对于还在纠结的同学们,有一定的帮助
position的四个属性值: relative ,absolute ,fixed,static 下面分别讲述这四个属性,以简单代码表示 <div id="parent" ...
- Mego(1) - NET中主流ORM框架性能对比
从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...
- 那些年,UI设计师还在手工标注和切图时走的弯路
在我从事UI设计师这几年的工作中逐渐发现,最让人糟心的不是应付各种奇葩的需求,完成设计稿,而是交付.每次交付的设计稿和最后开发出来的产品总是让我心塞无比,很少最终产品和我的设计稿是完全一致的. UI设 ...
- 【网络文摘】Androidguy:当你的才华还无法撑起你的野心时,那么应该静下心来学习
[序] 2013年12月初,接到51CTO的邀请写一篇关于挨踢人物传记的邀请.尽管写文章对我已不是什么新鲜事.数年来写的书和博客至少也在600万字以上.不过基本都是与技术有关的.写传记这还是头一次,也 ...
随机推荐
- [UCSD白板题] Pairwise Distinct Summands
Problem Introduction This is an example of a problem where a subproblem of the corresponding greedy ...
- ILSpy搜索功能加强版
1.修改搜索功能,增加如下的额外搜索选项 A.按文本搜索(默认选项) B.按通配符搜索 C.按正则表达式搜索 2.搜索增加如下特性: A.可以按照名字空间检索特定名字空间下的所有类. B.修正了官方版 ...
- html form 提交表单的一些问题
1. 如果在一个form里有summit按钮,则只能提交本form的内容
- Python-变量
1.Python的变量是什么 变量是用来存储计算机程序中的信息,唯一的目的是将数据存储在内存中. 2.Python变量的组成 变量由字母.数字.下划线组成: 变量的第一位不能是数字,可以是字母或下划线 ...
- ecshop数据表说明
ecshop数据表说明 数据库结构说明,以及自己在后台备份不需要备份的表(红色字体是不需要备份的表)备份文件在FTP或者服务器上网站根目录下data\sqldata下 数据库采用mysql,共78张表 ...
- iBatis简单介绍
1. Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...
- (转)linux服务器安全配置攻略
引言: 最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置,供大家参考. ...
- struts2 国际化的一个日期封装bug
输入用户的生日:时间格式是yyyy-MM-dd,这样的.使用struts2,在action中有一个熟悉是:private Date birth;struts2在默认的情况下会将birth值自动绑定,简 ...
- unity 状态机 + svn + 码云 上篇
最近刚找到在实习,忙于公司一个c++ 项目 ,一直想写博客来着,没时间写今天熬夜打算先献上自己前几天自己封装的一个fsm状态机 话不多说,直接上正题,这篇博客主要是在学校的时候状态机一直使用的是pla ...
- web.xml详解
web.xml的作用 web.xml,一个Tomcat工程中最重要的配置文件.web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器.监听器.Servlet等等.我试了一下,没有w ...