码迷,mamicode.com
首页 > 其他好文 > 详细

EF 延时加载与死锁

时间:2018-06-04 11:40:39      阅读:689      评论:0      收藏:0      [点我收藏+]

标签:alt   pre   延时加载   占用   问题   不可   存在   调试   var   

 

 

第一种

            #region 第一种延迟加载 用到的时候就会去查询数据。
            //用到的时候就会去查询数据。

            //IQueryable<UserInfo> temp = from u in dbContext.UserInfo 
            //                            //where  u.UName.Contains("o") 
            //                            //&& u.UName.StartsWith("D")
            //                            select u;
            //两种延迟加载

            //foreach (var userInfo in temp)
            //{
            //    Console.WriteLine(userInfo.ID + "  " +userInfo.UName);
            //}

            //foreach (var userInfo in temp)
            //{
            //    Console.WriteLine(userInfo.ID + "  " + userInfo.UName);
            //}
            //数据库监视发现:查询了两次。
            //因为IQueryable每次用到时都会重新查询,所以查询到的数据不可作为缓冲。

            //var temp2 = from u in temp
            //            where u.ID > 0
            //            select u;
            //foreach (var userInfo in temp2)
            //{
            //    Console.WriteLine(userInfo.ID + "  " + userInfo.UName);
            //} 
            //数据库监视发现 temp和temp2只查询了一次,linq查询生成的sql脚本自动合并了。
            #endregion

 

 

第二种

            #region 第二种延迟加载


            //情景1:数据量小的时候
            //foreach (var userInfo in temp)//100个用户数据。   共交互101,但数据量较少时,跟后台交互的时间就比 一次连接表查询时间还要长。
            //{
            //    foreach (var orderInfo in userInfo.OrderInfo)
            //    {
            //        Console.WriteLine(userInfo.UName+ "  " +orderInfo.ID + "  " + orderInfo.Content);
            //    }
            //}

            //情景2:但数据量特别大时。例如: 用户表跟订单表数据都是10000 0000条    
            //如果进行连接查询的时候:过滤数据实际是多少条?显然一次连接查询会时数据库崩溃。
            //这里使用多次查询,内存重组。 即上面的延迟加载技术简单的解决了这个问题。

            //问题来了: 
            //1数据量较少时怎么办?(一般不会再页面展示所有数据,而是分页,数据量不会特别大,那么必须减少连接数据库的次数)
            //表连接查询  Include("OrderInfo")
            //IQueryable<UserInfo> temp = from u in dbContext.UserInfo.Include("OrderInfo")
            //                            //where  u.UName.Contains("o") 
            //                            //&& u.UName.StartsWith("D")
            //                            select u;

            //2多次查询;并发访问怎么办?
            //理解并发:
            //在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
            //在关系数据库中,允许多个用户同时访问和更改共享数据的进程。SQL Server 使用锁定以允许多个用户同时访问和更改共享数据而彼此之间不发生冲突。
            //在这里访问由于锁的存在,并发问题转换成了计算能力问题,计算能力可以通过添加服务器来讲解决。

            //3死锁问题:
            //理解死锁
            //死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
            //出现情况 
            // 表连接查询出现: 进程X占用A表,X想连接B表,必须等B表释放; 但同时y又占用了B表,y想有连接了A表,在等A表释放。 结果x、y都在等待,二A、B表同时被占用着。
            // 连接的表越多,死锁问题越突出。
            //解决方案: 临时表
            //为什么能解决?因为此时锁定的是临时表,而原始表处于释放状态。
            //临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。
            //详情可百度临时表用法
            #endregion

 

怎么看生成的sql语句的?

1)数据库里

详情可百度:  SQL Server Profiler (事件追踪)

2)断点调试时
查询数据后,快速监视如下。查询数据前是没有这些内容的。

技术分享图片

 



 

 

 致博客园

1)傻逼的150字数限制!

2)范围竟然不包括代码!

3)添加成功修改失败,似乎对修改很有意见!

 致博客园

1)傻逼的150字数限制!

2)范围竟然不包括代码!

3)添加成功修改失败,似乎对修改很有意见!

 致博客园

1)傻逼的150字数限制!

2)范围竟然不包括代码!

3)添加成功修改失败,似乎对修改很有意见!

 

致网友:如有错误,望立刻指正。

EF 延时加载与死锁

标签:alt   pre   延时加载   占用   问题   不可   存在   调试   var   

原文地址:https://www.cnblogs.com/hao-1234-1234/p/9131496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!