EF 延时加载与死锁

 

 

第一种sql

            #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每次用到时都会从新查询,因此查询到的数据不可做为缓存。
       //测试二: linq的重用,在temp的基础上继续查询得temp2
//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语句。 至关于原生ADO时期的sql脚本拼接。 #endregion

 

 

第二种数据库

            #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)  交互1次
//{ // foreach (var orderInfo in userInfo.OrderInfo) 交互 100次 // { // Console.WriteLine(userInfo.UName+ " " +orderInfo.ID + " " + orderInfo.Content); // } //}
       //多表一次链接查询 Include("OrderInfo")
            //IQueryable<UserInfo> temp = from u in dbContext.UserInfo.Include("OrderInfo")
            //                            //where  u.UName.Contains("o") 
            //                            //&& u.UName.StartsWith("D")
            //                            select u;
            //情景1:当数据量小的时候(通常不会再页面展现全部数据,而是分页,数据量不会特别大,那么必须减小链接数据库的次数)
            //若采用单表查询,若查询100个用户数据,共需与数据库交互101=1+100,交互的时间就比一次"链接查询"时间还要长。
//因此数据量较少时直接使用链接查询比价高效。
            //情景2:当数据量特别大时。例如: 用户表跟订单表数据都是10000 0000条    
            //若采用一次链接查询:根据笛卡尔积,数据库过滤数据实际条数是10000 0000 * 10000 0000
//极可能会使数据库崩溃。
//若采单表屡次查询,内存中重组数据。能够很好的解决以上问题。
//问题来了: //并发访问 屡次查询,若出现并发访问怎么办? //理解并发: //在操做系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 //在关系数据库中,容许多个用户同时访问和更改共享数据的进程。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)范围居然不包括代码!spa

3)添加成功修改失败,彷佛对修改颇有意见!操作系统

 

致网友:若有错误,望马上指正。3d

相关文章
相关标签/搜索