很多人都不太认可以第三方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框架的更多相关文章

  1. 写一个ORM框架的第一步

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

  2. 写一个ORM框架的第一步(Apache Commons DbUtils)

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

  3. 我们一起来动手开发一个Orm框架,开源发布

    我们追求的方向 1)高性能. 这也是架构创建的目的之一,已经将它的性能提升到了极致.大家可以自己测试.我可以说其性能是数一数二的.连接地址:Moon洗冤录 2)易用性强 我想,用过Moon.ORM的应 ...

  4. Android轻量级ORM框架ActiveAndroid入门教程(转)

    注:没有找到出处,如有侵犯,请告知 开始ActiveAndroid神奇之旅: 在AndroidManifest.xml中我们需要添加这两个 AA_DB_NAME (数据库名称,这个name不能改,但是 ...

  5. python——type()、metaclass元类和精简ORM框架

    1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, ...

  6. 吉特仓库管理系统-ORM框架的使用

    最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...

  7. .NET ORM框架(一)

    最近做项目自己整理了一个ORM框架,分享给大家看看,有很多不足望大家指出. 下面是使用方法 BLL 主要方法 逻辑层:子类继承父类, 直接用BASE调用 ManagerBLL 中的方法. public ...

  8. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

  9. Mego(2) - NET主流ORM框架分析

    接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异.这里和大家分享下我对ORM框架的理解及一些使用经验. ORM框架工作原理 典型ORM ...

随机推荐

  1. [leetcode 48] rotate image

    1 题目 You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwi ...

  2. SQLServer内核架构剖析 (转载)

    SQL Server内核架构剖析 (转载) 这篇文章在我电脑里好长时间了,今天不小心给翻出来了,觉得写得很不错,因此贴出来共享. 不得不承认的是,一个优秀的软件是一步一步脚踏实地积累起来的,众多优秀的 ...

  3. OC中的自动引用计数

    目录: 1,自动引用计数的定义 2,强引用和弱引用 3,类比手动引用 4,循环引用 5,CoreFoundation 内容: 自动引用计数的定义: (Automatic Reference Count ...

  4. activeMq笔记

    安装 下载地址:http://activemq.apache.org/download.html 安装教程: http://gerrard-ok.iteye.com/blog/1766203 解压缩: ...

  5. 使用ABP时报错“UPDATE 语句与 FOREIGN KEY SAME TABLE 约束"FK_dbo.AbpUsers_dbo.AbpUsers_LastModifierUserId"冲突”的解决办法

    ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 问题 原因 解决办法 问题 问题的是在下面这种情况下出现的: 我在使用CodeFir ...

  6. ENode 2.0 - 介绍一下关于ENode中对Command的调度设计

    CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢?本文想通过不断提问和回答的方式,把我的思考写出来. 首先,我们最容易想到的是使用多线 ...

  7. java 网络(socket)

    本文梳理一个基础的java TCP消息通信,构造一个简单的Packet进行传输,代码如下: Packet public class Packet { private String attribute; ...

  8. js下的面向对象

    本文记录了一种Javascript的面向对象方法及原理理解,示例代码如下: //构造函数 var MClass = function(value1, value2) { this.member = & ...

  9. 新手的第一个phonegap Android应用

    对PhoneGap开发感兴趣的请加入群 PhoneGap App开发 348192525   手机成为现在软件应用必不可少的一种设备,然而手机平台的不统一造成我们需要为不同手机重写代码,这对一般应用来 ...

  10. html嵌套MP4、PDF的简单方案

    你需要一个jquery.media插件,http://malsup.com/jquery/media/ 然后: <html><head><script src=" ...