EF架构~数据分批批量提交
对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交,试想,如果你的数据量达到万级别(更不用说百万,千万数据了),那对数据库的压力是很大的,所以,我将EF批量操作语句进行了改版,并起名为BulkInsert,BulkUpdate和BulkDelete,事实上,在我之前的版本中并没有涉及到批次提交的概念,直到遇到了实际的问题,当你使用BulkInsert时,如果数据达到4万之前,那在SQL的解释时,也是很有压力的,有多情况下会超时,当然这与你的数据库服务器有关,但为了性能与安全,我还是决定将Bulk操作变为分批提交,即将4W进行分解,分用1W数据量提交一次,这样,对数据库的压力就小一些。看看我的改版吧。
public void BulkInsert(IEnumerable<TEntity> item)
{
DataPageProcess(item, (currentItems) =>
{
((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = ;//永不超时
_Db.Database.ExecuteSqlCommand(DoSQL(currentItems, SQLType.Insert));
});
} public void BulkDelete(IEnumerable<TEntity> item)
{
DataPageProcess(item, (currentItems) =>
{
((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = ;//永不超时
_Db.Database.ExecuteSqlCommand(DoSQL(currentItems, SQLType.Delete));
});
}
public void BulkUpdate(IEnumerable<TEntity> item)
{
DataPageProcess(item, (currentItems) =>
{
((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = ;//永不超时
_Db.Database.ExecuteSqlCommand(DoSQL(currentItems, SQLType.Update));
});
}
/// <summary>
/// 分页进行数据提交的逻辑
/// </summary>
/// <param name="item">原列表</param>
/// <param name="method">处理方法</param>
/// <param name="currentItem">要进行处理的新列表</param>
private void DataPageProcess(IEnumerable<TEntity> item, Action<IEnumerable<TEntity>> method)
{
if (item != null && item.Count() > )
{
DataTotalCount = item.Count();
this.DataTotalPages = item.Count() / DataPageSize;
if (DataTotalCount % DataPageSize > )
DataTotalPages += ;
for (int pageIndex = ; pageIndex <= DataTotalPages; pageIndex++)
{
var currentItems = item.Skip((pageIndex - ) * DataPageSize).Take(DataPageSize).ToList();
method(currentItems);
}
}
}
我们可以看到,改版后的方法,没有直接把集合item传递给方法ExecuteSqlCommand去执行,而去调用了一个方法,这个方法然后传入一个委托,然这个委托的
输入参数是一个分页的数据集合,这时你的ExecuteSqlCommand方法接入的集合参数将是一个分了页之后的小集合,呵呵。
对于一次提交的数量,你可以在类中去定义,它类似于分页,所以,我通常叫这个方法为数据分页提交!
#region Fields
/// <summary>
/// 数据总数
/// </summary>
int DataTotalCount = ; /// <summary>
/// 数据总页数
/// </summary>
int DataTotalPages = ; /// <summary>
/// 数据页面大小(每次向数据库提交的记录数)
/// </summary>
int DataPageSize = ;
#endregion
如果你希望得到BlukInsert的完整方法,请关注本人的EF架构系列
EF架构~数据分批批量提交的更多相关文章
- EF架构~过滤导航属性等,拼接SQL字符串
拼接T-SQL串,并使它具有通用性 好处:与服务器建立一次连接,给服务器发一条SQL命令,即可实现 代码如下: 1 /// <summary> 2 /// 构建Insert语句串 3 // ...
- EF架构~基于EF数据层的实现
回到目录 之前写过关于实现一个完整的EF架构的文章,文章的阅读量也是满大的,自己很欣慰,但是,那篇文章是我2011年写的,所以,技术有些不成熟,所以今天把我的2014年写的EF底层架构公开一下,这个架 ...
- EF架构~扩展一个分页处理大数据的方法
回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...
- EF架构~CodeFirst数据迁移与防数据库删除
回到目录 本文介绍两个概念,防数据库自动删除,这是由于在code first模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...
- js 批量提交数据
// 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...
- EF大数据批量添加性能问题(续)
昨天在园子里发了一篇如题的文章EF大数据批量添加性能问题,就引来一大堆的吐槽,我认为知识就应该这样分享出来,不然总以为自己很了不起:再说说昨天那篇文章,很多自认为很牛逼的人都评论说把SaveChang ...
- EF通用数据层封装类(支持读写分离,一主多从)
浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...
- EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一
回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是sect ...
- EF架构~CodeFirst生产环境的Migrations
回到目录 Migrations即迁移,它是EF的code first模式出现的产物,它意思是说,将代码的变化反映到数据库上,这种反映有两种环境,一是本地开发环境,别一种是服务器的生产环境,本地开发环境 ...
随机推荐
- 一行css代码调试中学到的javascript知识,很有意思
现在到处都是JavaScript,每天都能知道点新东西.一旦你入了门,你总能从这里或是那里领悟到很多知识.今天我想分享Addy Osmani的一行代码 ,这行代码对于你调试你的CSS是很有用的.为了可 ...
- spring mvc 使用ehcache
一.需要导入的jar包 1.ehcache.jar 2.ehcache-spring-annotations-1.2.0.jar 3.guava-r09.jar 4.slf4j-api-1.6.6.j ...
- VM12安装OS X10.11步骤及说明
参考文献: 1. http://www.crsay.com/network/enable-hardware-based-dep.html 2. http://jingyan.baidu.com/art ...
- office中通过宏添加快捷键
把“Microsoft 公式 3.0”作为一个按钮放在 2013中的快速访问工具栏的方法 在使用office办公软件的过程中,因为有的人还在使用office2003版本,所以在使用高版本的office ...
- React Native填坑之旅--class(番外篇)
无论React还是RN都已经迈入了ES6的时代,甚至凭借Babel的支持都进入了ES7.ES6内容很多,本文主要讲解类相关的内容. 构造函数 定义侦探类作为例子. ES5的"类"是 ...
- [UCSD白板题] Covering Segments by Points
Problem Introduction You are given a set of segments on a line and your goal is to mark as few point ...
- [SystemC] Setting Up the Environment
My operating system is Ubuntu 12.04. 0. Checking Your Compilers First thing first, you will need the ...
- 【dubbo】dubbo项目基本结构及provider构建
dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...
- 无鼠标Windows操作
1.常用tab键,方便跳转 2.打开软件方式: 1.win+1,2,3...依序打开任务栏图标.常用软件可以放在这里: 2.创建quickStart文件夹,配置路径,将所有要用到的功能都放在这里.( ...
- 浅析C语言指针问题
首先明白c语言操作符的优先级及结合性就很容易理解了. 链接 1.关于char *s 及 char s[] char *s指向的是一个字符串对象的指针,可以理解为间接引用,比如 char *s = “1 ...