博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF架构~数据分批批量提交
阅读量:7052 次
发布时间:2019-06-28

本文共 2692 字,大约阅读时间需要 8 分钟。

对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交,试想,如果你的数据量达到万级别(更不用说百万,千万数据了),那对数据库的压力是很大的,所以,我将EF批量操作语句进行了改版,并起名为BulkInsert,BulkUpdate和BulkDelete,事实上,在我之前的版本中并没有涉及到批次提交的概念,直到遇到了实际的问题,当你使用BulkInsert时,如果数据达到4万之前,那在SQL的解释时,也是很有压力的,有多情况下会超时,当然这与你的数据库服务器有关,但为了性能与安全,我还是决定将Bulk操作变为分批提交,即将4W进行分解,分用1W数据量提交一次,这样,对数据库的压力就小一些。看看我的改版吧。

   public void BulkInsert(IEnumerable
item) { DataPageProcess(item, (currentItems) => { ((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = 0;//永不超时 _Db.Database.ExecuteSqlCommand(DoSQL(currentItems, SQLType.Insert)); }); } public void BulkDelete(IEnumerable
item) { DataPageProcess(item, (currentItems) => { ((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = 0;//永不超时 _Db.Database.ExecuteSqlCommand(DoSQL(currentItems, SQLType.Delete)); }); }     public void BulkUpdate(IEnumerable
item) { DataPageProcess(item, (currentItems) => { ((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = 0;//永不超时 _Db.Database.ExecuteSqlCommand(DoSQL(currentItems, SQLType.Update)); }); }
///         /// 分页进行数据提交的逻辑        ///         /// 原列表        /// 处理方法        /// 要进行处理的新列表        private void DataPageProcess(IEnumerable
item, Action
> method) { if (item != null && item.Count() > 0) { DataTotalCount = item.Count(); this.DataTotalPages = item.Count() / DataPageSize; if (DataTotalCount % DataPageSize > 0) DataTotalPages += 1; for (int pageIndex = 1; pageIndex <= DataTotalPages; pageIndex++) { var currentItems = item.Skip((pageIndex - 1) * DataPageSize).Take(DataPageSize).ToList(); method(currentItems); } } }

 

我们可以看到,改版后的方法,没有直接把集合item传递给方法ExecuteSqlCommand去执行,而去调用了一个方法,这个方法然后传入一个委托,然这个委托的

输入参数是一个分页的数据集合,这时你的ExecuteSqlCommand方法接入的集合参数将是一个分了页之后的小集合,呵呵。

对于一次提交的数量,你可以在类中去定义,它类似于分页,所以,我通常叫这个方法为数据分页提交!

    #region Fields        ///         /// 数据总数        ///         int DataTotalCount = 0;        ///         /// 数据总页数        ///         int DataTotalPages = 0;        ///         /// 数据页面大小(每次向数据库提交的记录数)        ///         int DataPageSize = 10000;        #endregion

如果你希望得到BlukInsert的完整方法,请关注本人的

转载于:https://www.cnblogs.com/lori/p/3278921.html

你可能感兴趣的文章
LeetCode-330.Patching Array
查看>>
zxing生成二维码转base64 img直接显示 Image对象转Base64码(java)
查看>>
xfire冲突问题解决(maven配置)
查看>>
C#面向对象(三)接口实现多态
查看>>
Linux下用Java获取本机IP
查看>>
Eclipse的Spring库导入
查看>>
velocity 判断 变量 是否不是空或empty
查看>>
【leetcode】123. Best Time to Buy and Sell Stock III
查看>>
角色设计的特点
查看>>
sublime text格式化json快捷键
查看>>
获得数据库自动生成的主键
查看>>
磁盘阵列
查看>>
y轴数据变换利器——yaxis-transformer
查看>>
Hibernate缓存机制
查看>>
从头开始复习css之动画
查看>>
sed常见用法,删除匹配行的上2行,下3行
查看>>
【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
查看>>
android 7.1 调用相机崩溃解决办法
查看>>
访问控制符
查看>>
Android studio修改字体(font)大小(size)
查看>>