如何做好一个ORM框架
很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有用户群体大的ORM有保证,这点是不可否认确是事实。
但是往往用户群体大的ORM又有不足之处,就拿用户群体最多的两个ORM来说一下吧
1、EF
EF性能够用,但是总体还是和轻量级ORM有一定差距,如果没有差距就没有Dapper什么事儿了。
2、Dapper
性能不错,兼容也好但是就是语法太少,基本都要手写SQL,或自已扩展,自己扩展考虑的点可能连第三方ORM都不如,只能够自已需求使用,发现问题自已来改,没发现问题也挺安逸。
我的ORM之旅
1、感谢大家的帮助
第一 要感谢上海蓝灯数据科技股份有限公司给我构架师一职让.NET部门都使用我的技术框架
第二 百签软件的老总的大力支持除了自已员工使用外还帮我喧传
第三 群( 225982985)里的朋友向我提了很多保贵的问题和改进的建议。
第四 chloe.ORM的作者,两个人都为了ORM基情四射
2、谈一谈开发SqlSugarORM框架中遇到的一些坑
而这些坑我发现博客园的一些其它ORM也普遍存在,所以我将这些问题一一的分享,也希望更多人能够指出SqlSugar的不足之处。
(1)、避免Sql执时计划失效
Sql执行计划是什么,简单的说就是让Sql服务器更明确的知道你要做什么,将你的操作步骤存起来,下一次遇到同样的SQL便使用同样的操作步骤 ,大大降低SQL操作的步骤,提高性能,引起的性能差距可能是成倍的 。
参数化比拼SQL性能高的原因,也就是因为调用了系统存储过程 sp_executesql 将Sql执行计划的优势发挥了出来
如下图 name的长度为11,因为sqlparameter没有指定Size 所以nvarchar的数字是动态的,所以会导致Sql执行计划无效,一般的性能测试很难测出来,这种情况将会打乱Sql执行计划,当参数越多,参数的长度越大性能差距越明显。
而固定长度的测试根本发现不了。

解决方案:
将SqlParameter size<4000
全部设为4000,EF和Dapper在这点上就做的非常的棒
例如出现 id<1&&id>0处理两个相同的名字参数时 id<@id and id>@id+随机数
只要加了随机数就无法进执行计划了
解决方案:
自增数 id<@id and id>@id1
2、数据类形转换成实体的处理
这一点就Dapper做的最好,EF也不错给出了很明确的错误信息。
为什么说Dapper做的最好呢,因为Dapper能把数据的int转换成实体类中的string。数据库是string转换成int时就给出了非常明确的错误信息。
目前第三方ORM都没在这方面做很好的处理
解决方案:
需要做很细的类型判段,我的做法是在Emit生成Dynamicbuilder之前处理,用数据库类型和实体类体做对比,将异常提前抛出,没有异常EMIT对象将存进缓存,预热后不会在执行。
3、性能的突破
就单纯拿Emit将DataReader转成List<T>来说,第三方的ORM基本上都做到了比Dapper快或者说平分秋色。
预热后一次查询100万条数据这是最好的测试方式,但要注意一点 如果走的是 DataReader的索引器 那就会有性能损耗
GetValue和索引器都是Object类型执行转换后将会产生 拆箱(将OBJECT转成了值类型),SqlSugar能在这个方面得到改进,多亏Chloe.ORM作者帮我发现了这个问题

4、拉姆达解析性能
如何测试自已拉姆达解析成SQL过程花时间多长呢,
测试方法:每执行一次只查询一条数据,WHERE条件多设一点。执行次数10000以上。
解决方案:在解析过程中千万不能用 Expression.Lambda(exp).Compile().DynamicInvoke();
用了这种写法将会带来十倍的性能之差,按上面的测试方式很容易测出性能的瓶颈。
越短的时间内执行的次数越多越容易体现出来。
发布到Nuget2周时间不到

我已经提交了这么多次修改

SqlSugar的用法和介简:http://www.cnblogs.com/sunkaixuan/p/5654695.html ,欢迎您的建议
最后我只想说一句,不是第三方ORM不能用,而是你们并没有把问题指出来,代码开源就是为了让大家一起进步,一起改进。
只要作者有激情,有上进心,还担心什么呢。
如何做好一个ORM框架的更多相关文章
- 写一个ORM框架的第一步
新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...
- 写一个ORM框架的第一步(Apache Commons DbUtils)
新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...
- 我们一起来动手开发一个Orm框架,开源发布
我们追求的方向 1)高性能. 这也是架构创建的目的之一,已经将它的性能提升到了极致.大家可以自己测试.我可以说其性能是数一数二的.连接地址:Moon洗冤录 2)易用性强 我想,用过Moon.ORM的应 ...
- Android轻量级ORM框架ActiveAndroid入门教程(转)
注:没有找到出处,如有侵犯,请告知 开始ActiveAndroid神奇之旅: 在AndroidManifest.xml中我们需要添加这两个 AA_DB_NAME (数据库名称,这个name不能改,但是 ...
- python——type()、metaclass元类和精简ORM框架
1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, ...
- 吉特仓库管理系统-ORM框架的使用
最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...
- .NET ORM框架(一)
最近做项目自己整理了一个ORM框架,分享给大家看看,有很多不足望大家指出. 下面是使用方法 BLL 主要方法 逻辑层:子类继承父类, 直接用BASE调用 ManagerBLL 中的方法. public ...
- 自定义ORM框架(转转)
ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...
- Mego(2) - NET主流ORM框架分析
接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异.这里和大家分享下我对ORM框架的理解及一些使用经验. ORM框架工作原理 典型ORM ...
随机推荐
- Knockoutjs 实践入门 (1) 属性绑定
1 是什么? 使用MVVM模式的简单,动态的Javascript UI. 2 优点 声明式绑定 UI 自动更新 依赖追踪 模板化 3 如何使用 & ...
- asp.net identity 2.2.0 中角色启用和基本使用(二)
建立模型 第一步:在Models文件夹上点右键 >添加>类 类的名称自定,我用AdminViewModels命名的 因为是讲基本使用,我这里不做任何扩展. 第二步:添加如下命名空间 ...
- ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上
一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...
- RCP: MANIFEST.MF, plugin.xml, build.properties三种文件的区别
在Eclipse插件开发中, MANIFEST.MF, plugin.xml, build.properties是三种最常见的文件,由于它们共享同一个编辑器(Plug-in Manifest Edit ...
- 用 C 扩展 python
本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...
- kafka的一些认识
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 近来无事研究了一下kafka,并且用golang连接kafka做了producer和consumer的简单测试 ...
- WebApi系列~StringContent参数需要添加MetaType对象
回到目录 对于api调用已经很多见了,在客户端去post一个请求到API服务端也是经常见到,但有时不注意,可能会引起一些问题,如为一个HttpContent参数进行赋值时,如果使用StringCont ...
- Android开发学习之路-Palette颜色提取工具类使用
视频(要FQ):https://www.youtube.com/watch?v=5u0dtzXL3PQ Palette是一个在support-v7包中的一个颜色提取工具类,用法比较简单,而且是谷歌官方 ...
- [Redis]Redis 概述及基本使用规范.
1 nosql的简介 1.1 nosql简介 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露 ...
- Atitit 文档资料管理同步解决方案
Atitit 文档资料管理同步解决方案 流程 生成快照, 操作. 使用快照与dir对比,生成操作日志 /atiplat_cms/src/com/attilax/sync/SyncUtil.java p ...