EF批量添加数据性能慢的问题的解决方案

 //EF批量添加数据性能慢的问题的解决方案

        public ActionResult BatchAdd()
        {
            using (var db = new ToneRoad.CEA.DbContext.DbContext())
            {
                //**********************第一种解决方案  直接使用sql**********************

                string sqls = "";
                for (int i = 0; i < 100000; i++)
                {
                    sqls += "sql" + i;
                }
                db.Database.ExecuteSqlCommand(sqls);

                //**********************第二种解决方案  异步并行计算**********************

                List<SYS_User> LIST = new List<SYS_User>();
                ParallelOptions _po = new ParallelOptions();
                _po.MaxDegreeOfParallelism = Environment.ProcessorCount;
                Parallel.ForEach<SYS_User>(LIST, c =>
                {
                    db.SYS_User.Add(c);
                    db.SaveChanges();

                });

                //**********************第三种解决方案 关闭EF跟踪验证**********************

                //关闭 自动跟踪对象的属性变化的功能,默认情况下EF会开启对附加到EF上下文中的实体对象进行校验,看已经附加到上下文中的实体对象的属性是否发生变化,这在大量数据添加时会影响性能。
                db.Configuration.AutoDetectChangesEnabled = false;
                //保存前验证对象的属性最大最小长度等,默认为true,关闭会提高性能
                db.Configuration.ValidateOnSaveEnabled = false;

                List<SYS_User> list = new List<SYS_User>();
                for (int i = 0; i < 100000; i++)
                {
                    SYS_User user = new SYS_User() { UserName = "sa", Password = "123" };
                    list.Add(user);
                }
                db.SYS_User.AddRange(list);
                db.SaveChanges();

                //**********************第四种解决方案 使用SQL Server的bcp命令**********************

                //Microsoft SQL Server 提供的一个称为 bcp(批量流处理)) 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表

                List<SYS_User> lists = new List<SYS_User>();
                for (int i = 0; i < 100000; i++)
                {
                    SYS_User user = new SYS_User() { UserName = "sa", Password = "123" };
                    lists.Add(user);
                }
                BulkCopy<SYS_User>(db, lists);

                return View();
            }
        }
        public void BulkCopy<T>(ToneRoad.CEA.DbContext.DbContext db, IList<T> list)
        {
            using (var con = db.Database.Connection as System.Data.SqlClient.SqlConnection)
            {
                con.Open();

                using (var bulkCopy = new SqlBulkCopy(con))
                {
                    bulkCopy.BatchSize = list.Count;
                    bulkCopy.DestinationTableName = typeof(T).Name;

                    var table = new DataTable();
                    var props = TypeDescriptor.GetProperties(typeof(T))
                        .Cast<PropertyDescriptor>()
                        .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
                        .ToArray();

                    foreach (var propertyInfo in props)
                    {
                        bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
                        table.Columns.Add(propertyInfo.Name,
                            Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
                    }

                    var values = new object[props.Length];
                    foreach (var item in list)
                    {
                        for (var i = 0; i < values.Length; i++)
                        {
                            values[i] = props[i].GetValue(item);
                        }

                        table.Rows.Add(values);
                    }

                    bulkCopy.WriteToServer(table);
                }
                con.Close();
            }
        }
时间: 2024-11-10 05:04:59

EF批量添加数据性能慢的问题的解决方案的相关文章

.Net中批量添加数据的几种实现方法比较

在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或foreach循环一条一条的添加. for (int i = 0; i < dgv.Rows.Count; i++) { string sql = "insert into ....."; SqlHelper.ExcuteNonQuery(CommandType.Text, sql, nu

Yii2如何批量添加数据

批量添加这个操作,在实际开发中经常用得到,今天小编抽空给大家整理些有关yii2批量添加的问题,感兴趣的朋友一起看看吧. 在上篇文章给大家介绍了关于浅析Yii2 gridview实现批量删除教程,当然,着重点在于怎么去操作gridview了,今儿我们来好好谈谈yii2如何批量添加数据? 有同学嚷嚷了,这还不简单,我foreach一循环,每个循环里面直接把数据插入到数据库,简单粗暴完事!我擦嘞,哥,你要是跟我在一个公司,我觉得第二天见到你的概率可就不大了! 话不多说,说多了你在骂我,我们步入正题,先

ADO.NET批量添加数据到SQL Server—BulkCopy使用指南

BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表. 属性: BatchSize :每个批处理中的行数. 在每个批处理结束时,批处理中的行将发送到服务器. BulkCopyTimeout:超时之前可用于完成操作的秒数. ColumnMappings:返回 SqlBulkCopyColumnMapping 项的集合. 列映射定义数据源中的列和目标中的列之间的关系. DestinationTableName:服务器上

SSM批量添加数据

如何应对面临批量数据时如何提交给后台 方式1: 使用JSON格式 后台功能接受实现使用@ResponseBody 前端当有多行数据的时候添加到一个数组再通过JSON格式到后台List接收 @RequestMapping(value = "/emp01",method = RequestMethod.POST, produces = "application/json") @ResponseBody public String empAdd02(@RequestBod

CI 框架批量添加数据(如果数据库有就更新数据)

model: public function insert_select($values) { $sql = 'INSERT INTO ' . $this->_table_name . '(article_id,user_id,share_link,short_link,read_price,created_at,updated_at) VALUES ' . $values . ' ON DUPLICATE KEY UPDATE article_id=values(article_id),use

存储过程并批量添加数据

1 ALTER proc [dbo].[Dki_GBC_DownloadHistory] 2 ( 3 @CMD varchar(20), 4 @ContactPersonID int=0, 5 @UserID int=0 ---用户 6 ) 7 as 8 if @CMD is null 9 begin 10 print N'param @CMD can not is null!' 11 return 0 12 end 13 begin tran 14 ----------------------

java操作elasticsearch实现批量添加数据(bulk)

java操作elasticsearch实现批量添加主要使用了bulk 代码如下: //bulk批量操作(批量添加) @Test public void test7() throws IOException { //1.指定es集群 cluster.name 是固定的key值,my-application是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "my-application"

mysql批量更新数据(性能优化)

最近做的游戏,上线后出了不少问题,所以我就经常去查数据库数据,翻各种日志等,但是在查询的时候发现好蛋疼,有些地方的时间是写 "2016-08-11 20:13:02"这种格式,有些地方的时间是写 "1470917582000"这种格式,然后多张表数据进行对比的时候就很蛋疼,我得不停进行时间转换,恶心得不行.最后实在忍不了,我要统一时间格式(由于时间都是单独一个字段记录,所以比较好处理),两种格式,很明显,对于查数据来说,第一种格式更直观,所以就决定了,将数据库日志类

EF批量插入数据(Z.EntityFramework.Extensions)

EF用原生的插入数据方法DbSet.ADD()和 DbSet.AddRange()都很慢.所以要做大型的批量插入只能另选它法. 1.Nugget 2.代码 using EF6._0Test.EF; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace EF6._0Test { class Program { static void Main(st