Insert测试,只测试1000条的情况,多了在实际的项目中应该就要另行处理了。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using EE.Service.DbAccess;
using EE.Service.DbEntity;
using EntityFramework.Extensions;
using EntityFramework.Future;
using MySql.Data.MySqlClient; namespace EE.Services.ConsoleTest.DbAccessTests
{
public class EFPerformanceTest
{
public static void Run()
{
//InsertTest(); UpdateTests();
} #region UpdateTest() static void UpdateTests()
{
var list = new List<SmsLog>();
for (int i = ; i < ; i++)
{
list.Add(new SmsLog() { Id = i, AppId = $"{i}_", CreateTime = DateTime.Now });
}
var sw = new Stopwatch();
Watcher(sw, EFInit, list.GetRange(, )); Watcher(sw, MySqlSelect, list); Watcher(sw, EFSelect,list); Watcher(sw, MySqlUpdate, list); Watcher(sw, EFBulkUpdate, AddRangeId(list)); Watcher(sw, EFUpdateWithNoState, AddRangeId(list)); Watcher(sw, EFUpdate, AddRangeId(list)); } static IEnumerable<SmsLog> AddRangeId(IEnumerable<SmsLog> logs)
{
foreach (var log in logs)
{
log.Id += ;
}
return logs;
} static int EFSelect(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
var val = ;
foreach (var item in items)
{
var rst = (from tb in db.SmsLogs where tb.Id == select tb).FirstOrDefault();
if (rst != null) val++;
}
return val;
}
} static int EFUpdate(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
foreach (var item in items)
{
//db.SmsLogs.Attach(item);
var o = db.SmsLogs.Where(x => x.Id == item.Id).FirstOrDefault();
if (o == null) continue;
o.AppId = item.AppId+"U";
o.CreateTime = item.CreateTime;
}
var val = db.SaveChanges();
return val;
}
} static int EFUpdateWithNoState(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;
var val = ;
foreach (var item in items)
{
//传统更新方式 .. 更新不了(没有状态,无法完成更新)
var o = db.SmsLogs.Where(x => x.Id == item.Id).FirstOrDefault();
if (o == null) continue;
o.AppId = item.AppId+"SU";
o.CreateTime = item.CreateTime;
}
val = db.SaveChanges();
return val;
}
} static int EFBulkUpdate(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
foreach (var item in items)
{
var o = db.SmsLogs.Where(x => x.Id == item.Id).FirstOrDefault();
if (o == null) continue;
o.AppId = item.AppId+"BU";
o.CreateTime = item.CreateTime;
}
db.BulkSaveChanges();
return ;
}
} static int MySqlUpdate(IEnumerable<SmsLog> items)
{
var val = ;
var connStr = ConfigurationManager.ConnectionStrings["EEServiceLogDb"].ConnectionString;
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
foreach (var item in items)
{
val += MySqlHelper.ExecuteNonQuery(conn, "Update SmsLogs set AppId=@appId,CreateTime=@createTime where Id = @id;", new MySqlParameter("@appId", item.AppId+"S"), new MySqlParameter("@createTime", item.CreateTime), new MySqlParameter("@id", item.Id));
}
conn.Close();
}
return val;
}
static int MySqlSelect(IEnumerable<SmsLog> items)
{
var val = ;
var connStr = ConfigurationManager.ConnectionStrings["EEServiceLogDb"].ConnectionString;
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
foreach (var item in items)
{
var dr = MySqlHelper.ExecuteReader(conn, "select * from SmsLogs where Id = @id;", new[] { new MySqlParameter("@id", item.Id) });
while (dr.Read())
{
val += ;
}
dr.Close();
}
conn.Close();
}
return val;
} #endregion #region InsertTest() static void InsertTest()
{
var list = new List<SmsLog>();
for (int i = ; i < ; i++)
{
list.Add(new SmsLog() { AppId = $"{i}", CreateTime = DateTime.Now });
}
var sw = new Stopwatch(); Watcher(sw, EFInit, list.GetRange(, ));
Watcher(sw, EFBulkInsert, list);
Watcher(sw, EFInsertWithNoState, list);
Watcher(sw, EFInsert, list);
Watcher(sw, MySqlInsert, list);
//Watcher(sw, EFInsert, list); } static int EFInsert(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
foreach (var item in items)
db.SmsLogs.Add(item); var val = db.SaveChanges();
return val;
}
} static int EFInsertWithNoState(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false; foreach (var item in items)
db.SmsLogs.Add(item); var val = db.SaveChanges();
return val;
}
} static int EFBulkInsert(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
//db.Configuration.AutoDetectChangesEnabled = false;
//db.Configuration.ValidateOnSaveEnabled = false;
foreach (var item in items)
db.SmsLogs.Add(item); db.BulkSaveChanges();
return ;
}
} static int MySqlInsert(IEnumerable<SmsLog> items)
{
var val = ;
var connStr = ConfigurationManager.ConnectionStrings["EEServiceLogDb"].ConnectionString;
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
foreach (var item in items)
{
val += MySqlHelper.ExecuteNonQuery(conn, "Insert into SmsLogs(AppId,CreateTime)values(@appId,@createTime)", new MySqlParameter("@appId", item.AppId), new MySqlParameter("@createTime", item.CreateTime));
}
conn.Close();
}
return val;
} #endregion /// <summary>
/// 初始化一下,尽量减少EF初始化时间的影响
/// </summary>
/// <param name="items"></param>
/// <returns></returns>
static int EFInit(IEnumerable<SmsLog> items)
{
using (var db = new ServiceLogDbContent())
{
foreach (var item in items)
{
var o = db.SmsLogs.FirstOrDefault(x => x.Id == item.Id);
if (o != null)
{
o.AppId = "Init";
}
}
var val = db.SaveChanges();
return val;
}
} static void Watcher<T>(Stopwatch stopwatch, Func<IEnumerable<T>, int> func, IEnumerable<T> list)
{
if (stopwatch == null) stopwatch = new Stopwatch();
stopwatch.Reset();
Console.WriteLine($"[{DateTime.Now:HH:mm:ss ffffff}] {func.Method.Name} BEGIN =====================================================");
stopwatch.Start();
var val = func(list);
stopwatch.Stop();
Console.WriteLine($"[{DateTime.Now:HH:mm:ss ffffff}] {func.Method.Name}[{stopwatch.Elapsed} IN<{list.Count()}> -> RS<{val}>]");
//Console.WriteLine($"[{DateTime.Now:HH:mm:ss ffffff}] {func.Method.Name} end");
} }
}

本机开发机,DB在内网服务器上。测试结果:

可以看到,EF的初始执行还是蛮耗时间的。扩展的BuilInsert要比循环的MySqlInsert语句效率还好一些。关掉状态跟踪与默认情况,差别不大(不知是不是我写的有问题)。

这么一看,是因为查询慢吗?

更新的方式就是选Where出对象,再修改对象的值,再SaveChagnes。 难道是我写的方式不对?为什么查询这么慢?

-----------------------------------------------------------------------------------------------------------------------------------

原来不是我的写的问题,而是配置问题,连接串中没有池化与有池化的结果相差近10倍。这算什么???

Pooling=false|true;

连接串中的这个就是影响性能差别巨大的“元凶”

下面的是EF的Save,即AddOrUpdate ,通过1000条的测试发现:耗时都在4~5秒左右。比起先Select再Update还是要耗时一些。所以在性能有要求的地方,要稍微慎重一些。是不是先读取后赋值一下再Update。还是直接AddOrUpdate

 

测试EntityFramework,Z.EntityFramework.Extensions,原生语句在不同的查询中的表现。原来池化与非池化设定是有巨大的影响的。的更多相关文章

  1. 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

    一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...

  2. 【EF】解决EF批量操作,Z.EntityFramework.Extensions 过期方案

    方案一: 使用EntityFramework.Extended优点: 启下载量是Z.EntityFramework.Extensions的10倍+ 不会过期缺点:不能批量Insert 方案二:解决批量 ...

  3. 自己动手破解Z.EntityFramework.Extensions 4.0.11.0的方法

    因为项目中使用到Z.EntityFramework.Extensions 和 Z.EntityFramework.Plus(免费开源)两个类库,但是Z.EntityFramework.Extensio ...

  4. 破解EFCore扩展Dll --- Z.EntityFramework.Extensions.EFCore

    安装 Z.EntityFramework.Extensions.EFCore Install-Package Z.EntityFramework.Extensions.EFCore -Version ...

  5. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

    一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并 ...

  6. Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    Cookies   1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...

  7. MongoDB学习笔记~使用原生语句实现三层集合关系的更新

    回到目录 MongoDB的文档型数据结构使得它在存储数据上很像JSON,在可读性方面很强,然而这种复杂的结构在update时相对麻烦一些,而对于官方给出的文档说的也不够细致,有些东西也是模棱两可的态度 ...

  8. Mysql存储之原生语句操作(pymysql)

    Mysql存储之原生语句操作(pymysql) 关系型数据库是基于关系模型的数据库,而关系模型是通过二维表时实现的,于是构成了行列的表结构. 表可以看作是某个实体的集合,而实体之间存在联系,这个就需要 ...

  9. sql语句(已在Oracle中测试,之后有添加内容放在评论中)

    1增 1.1[创建一张表] create table 表名(列名 类型); 例: ),性别 ),出生日期 date); ),sex ),出生日期 date); 1.2[插入单行]insert [int ...

随机推荐

  1. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  2. CSS布局之div交叉排布与底部对齐--flex实现

    最近在用wordpress写页面时,设计师给出了一种网页排布图样,之前从未遇到过,其在电脑上(分辨率大于768px)的效果图如下: 而在手机(分辨率小于等于768px)上要求这样排列: 我想到了两种方 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(3)-漂亮系统登陆界面

    系列目录 前言 本文于2016-10修改 这次的代码是基于上一节的代码集成的,素材都在第二节里头 本次添加登录页面的控制器即可 实现 添加Account的Index视图: @{ Layout = nu ...

  4. 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

    文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html 系列目录 前言: 导入导出实在多例子,很多成熟的组建都分装了 ...

  5. YYModel 源码解读(二)之YYClassInfo.h (3)

    前边3篇介绍了YYClassinfo 文件的组成单元,算是功能的分割,按照业务的设计思想来说,方向应该是相反的 由此引申出我们在设计api的思想其实和项目管理是很类似的----- 一些题外话 1.目的 ...

  6. ORA 各种oraclesql错误

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...

  7. 新年抢红包效果(New Year Red Packet)

    新年抢红包效果(New Year Red Packet) 晓娜的文章(微信公众号:migufe) 2016即将过去,我们将迎来新的一年2017,这里小编提前祝大家新年快乐!万事如意!那我们新年最开心的 ...

  8. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  9. StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之处,已经有所修改. 今天分 ...

  10. 几道web前端练习题目

    在 HTML 语言中,以下哪个属性不是通用属性?A]<class>B]<title>C]<href>D]<style> 在线练习:http://hove ...