全国 【切换城市】欢迎您来到装修百科!
关注我们
我要装修

EF插入记录和删除历史记录多线程安全测试(ef如何实现对数据库增删改查)

发布:2024-06-23 浏览:39

核心提示:1. 测试删除记录操作效率1.1 测试单条记录删除效率 Stopwatch mainStopWatch = new Stopwatch(); mainStopWatch.Start();using (var dbContext = new SQLiteDbContext()) {var data = dbContext.Set<Bus>().FirstOrDefault(i => true);if (data != null) dbContext.Set<Bus>().Rem

1. 测试删除记录操作效率1.1 测试单条记录删除效率 Stopwatch mainStopWatch = new Stopwatch();mainStopWatch.Start();using (var dbContext = new SQLiteDbContext()){ var data = dbContext.Set<Bus>().FirstOrDefault(i => true); if (data != null) dbContext.Set<Bus>().Remove(data); dbContext.SaveChanges();}mainStopWatch.Stop();Console.WriteLine("TestAddAndDeleteHistory - query 1 record and Remove cost " + mainStopWatch.ElapsedMilliseconds + "ms");1.2 测试10条记录删除效率 mainStopWatch.Restart();//原始模式测试删除10条历史记录的效率using (var dbContext = new SQLiteDbContext()){ var datas = dbContext.Set<Bus>().Where(i=>true).Take(10); dbContext.Set<Bus>().RemoveRange(datas); dbContext.SaveChanges();}mainStopWatch.Stop();Console.WriteLine("TestAddAndDeleteHistory - query 10 records and RemoveRange cost " + mainStopWatch.ElapsedMilliseconds + "ms");1.3 测试添加一条记录效率//原始模式测试添加1条历史记录的效率using (var dbContext = new SQLiteDbContext()){ var data = dbContext.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); dbContext.SaveChanges();}mainStopWatch.Stop();Console.WriteLine("TestAddAndDeleteHistory - Add 1 records cost " + mainStopWatch.ElapsedMilliseconds + "ms");1.4 测试结果2. 测试多次删除执行效率2.1 测试一:测试单一DbContext删除100次(每次10条记录)效率2.1.1 测试代码mainStopWatch.Restart();//同一个DbContext执行100次删除操作(每次10条记录)花费时间using (SQLiteDbContext db = new SQLiteDbContext()){ for (int i = 0; i < 100; i++) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } }}mainStopWatch.Stop();Console.WriteLine("TestAddAndDeleteHistory - Single DbContext RemoveRange 100 times (10 records per time) cost " + mainStopWatch.ElapsedMilliseconds + "ms");2.2 测试二:测试删除100次(每次10条记录),每次删除一个DbContext效率2.2.1 测试代码mainStopWatch.Restart();//执行100次删除操作(每次10条记录)每次一个DbContext花费时间for (int i = 0; i < 100; i++){ using (SQLiteDbContext db = new SQLiteDbContext()) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } }}mainStopWatch.Stop();Console.WriteLine("TestAddAndDeleteHistory - RemoveRange 100 times (10 records per time)," + "one DbContext every time cost "+ mainStopWatch.ElapsedMilliseconds + "ms");2.3 测试结论测试二比测试一效率略高跟单次删除相比,多次删除效率高于单次删除3. 测试单一context多线程添加和删除3.1 测试代码//单一context添加删除多线程测试SQLiteDbContext db = new SQLiteDbContext();var task1 = Task.Factory.StartNew(() =>{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 1000; i++) { db.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); db.SaveChanges(); } } stopwatch.Stop(); Console.WriteLine("Single Context Task1 write 1000 records cost = " + stopwatch.ElapsedMilliseconds + "ms");});var task2 = Task.Factory.StartNew(() =>{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 100; i++) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } Thread.Sleep(50); } } stopwatch.Stop(); Console.WriteLine("Single Context Task2 write 50 records cost = " + stopwatch.ElapsedMilliseconds + "ms");});Task.WaitAll(task1, task2);db.Dispose();3.2 测试结果:多线程异常4. 测试每个线程一个DbContex的多线程添加和删除记录4.1 测试代码var task1 = Task.Factory.StartNew(() =>{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 1000; i++) { db.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); db.SaveChanges(); } } stopwatch.Stop(); Console.WriteLine("Using Context Task1 write 1000 records cost = " + stopwatch.ElapsedMilliseconds + "ms");});var task2 = Task.Factory.StartNew(() =>{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 100; i++) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } } } stopwatch.Stop(); Console.WriteLine("Using Context Task2 Remove 100 * 10 records cost = " + stopwatch.ElapsedMilliseconds + "ms");});Task.WaitAll(task1, task2);4.2 测试结果未出现异常,说明每个线程(上下文)一个DbContext是线程安全的添加一条记录时间330ms左右,跟单独Add相差不大删除一次执行时间1231ms,时间较长,可能收到多线程的影响5. 测试多线程添加和删除,每次操作都Using一个DbContext5.1 测试代码var task1 = Task.Factory.StartNew(() =>{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < 1000; i++) { using (SQLiteDbContext db = new SQLiteDbContext()) { db.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); db.SaveChanges(); } } stopwatch.Stop(); Console.WriteLine("Using Context Task1 write 1000 records cost = " + stopwatch.ElapsedMilliseconds + "ms");});var task2 = Task.Factory.StartNew(() =>{ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < 100; i++) { using (SQLiteDbContext db = new SQLiteDbContext()) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } } } stopwatch.Stop(); Console.WriteLine("Using Context Task2 Remove 100 * 10 records cost = " + stopwatch.ElapsedMilliseconds + "ms");});Task.WaitAll(task1, task2);5.2 测试结论未出现异常添加一条记录时间338ms左右,跟单独Add相差不大删除一次执行时间813ms,时间较长,但比每个线程一个DbContext时间短可能收到多线程的影响

  • 收藏

分享给我的朋友们:

上一篇:SSH和SSM的区别,抽丝剥茧由内到外给你讲清楚(ssh 和 ssm) 下一篇:天燃气热水器选购注意什么 天燃气热水器的禁忌是什么

一键免费领取报价清单 专享六大服务礼包

装修全程保障

免费户型设计+免费装修报价

已有312290人领取

关键字: 装修报价 装修网 装修风格

发布招标得免费设计

申请装修立省30%

更多装修专区

点击排行