EF连接数据库经常出现当前连接状态为打开

问题描述

网站使用技术是asp.netmvc+EF过两天网站就报错,错误日志记录:执行命令定义时出错。有关详细信息,请参阅内部异常。--->System.InvalidOperationException:ExecuteReader要求已打开且可用的Connection。连接的当前状态为打开。网上去查都是ado.net的答案:if(Connection.Sate==Connection.Open){conn.Close();}之类的答案请问在EF中怎去关闭连接网站首页查询组成:1、连接一张表查询2、连接五张表查询(左连接)3、连接一张表查询4、连接一张表查询5、连接一张表查询五个查询都是用的Linq查询,延迟加载,请问如何在EF中控制数据库的打开和关闭,EF是用连接池的方式去创建连接吗?请指点,谢谢。

解决方案

解决方案二:
EF不用关闭吧,反正我写的时候没关闭,内部应该自动释放的如果非要写,应该这么写using(Entitiesentities=newEntities()){varquery=fromcinentities.Customerswherec.Address.City==cityselectc;foreach(Customerscinquery)Console.WriteLine(c.CompanyName);}

类似这么写
解决方案三:
贴bug调试画面,给出具体的代码、和你的初步调试。
解决方案四:
引用2楼sp1234的回复:

贴bug调试画面,给出具体的代码、和你的初步调试。

这个问题只有在线上运行时才会出现,调试是调不出bug的。每隔三四天就会出现这样的问题,不过内容就是:执行命令定义时出错。有关详细信息,请参阅内部异常。--->System.InvalidOperationException:ExecuteReader要求已打开且可用的Connection。连接的当前状态为打开。
解决方案五:
还请过路的高手指点一二
解决方案六:
大多是因为在对IQueryable迭代的时候用导航属性,解决方法是先将IQueryable转换为List
解决方案七:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来
解决方案八:
引用3楼toploveall的回复:

Quote: 引用2楼sp1234的回复:
贴bug调试画面,给出具体的代码、和你的初步调试。

这个问题只有在线上运行时才会出现,调试是调不出bug的。每隔三四天就会出现这样的问题,不过内容就是:执行命令定义时出错。有关详细信息,请参阅内部异常。--->System.InvalidOperationException:ExecuteReader要求已打开且可用的Connection。连接的当前状态为打开。

那是因为你没有花必要的精力在测试时去重现bug,不是“调试时调不出bug”。最起码地,你应该贴出具体的画面说明“到底是哪一行代码抛出的异常”。否则你的bug报告很不到位,仅仅让别人去纠结理论是非,往往产生比不要的争议。
解决方案九:
观察bug问题,设计测试用例,然后确保可以重现问题,这本身确实需要技术水平的。如果你只是“编写代码”,而懒得设计测试用例,那么我只能说“无能为力”,你还是需要请别人替你负责解决bug。
解决方案十:
引用6楼moonwrite的回复:

5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来

现在的代码在BLL层全是用的单例模式,不明白为什么单例会出错。
解决方案十一:
引用9楼toploveall的回复:

Quote: 引用6楼moonwrite的回复:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来

现在的代码在BLL层全是用的单例模式,不明白为什么单例会出错。

你的bll会让dal也不会释放么?如果是因为EF有自己的缓存策略~~~在EF单例模式下,你的增删改查都在EF的内存中~不是实时到数据库https://msdn.microsoft.com/zh-cn/library/gg696418而且你查询的数据都会缓存到EF中....
解决方案十二:
引用6楼moonwrite的回复:

5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来

ToList会有什么问题?
解决方案十三:
引用11楼KarasCanvas的回复:

Quote: 引用6楼moonwrite的回复:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来

ToList会有什么问题?

大多是因为在对IQueryable迭代的时候用导航属性,解决方法是先将IQueryable转换为List你想说通过Tolist把数据拿到内存中再foreach什么的~~~从而来减少对数据库的查询我明白你的意思但一般新手不知道tolist会产生一个怎么样的行为另外就是他在IQueryableforeach会造成这个异常么
解决方案十四:

解决方案十五:
引用12楼moonwrite的回复:

但一般新手不知道tolist会产生一个怎么样的行为

为什么不知道?完全是你猜的是不是导航属性的问题,等楼主测试,原因是对IQueryable迭代同时使用导航属性需要同时使用两个datareader,楼主碰到的是不是这个问题我不确定
解决方案:
我碰到的问题应该和6楼的解释有关BLL层和DAL层全是单例+工厂模式
解决方案:
看不到工厂~单例模式也用得不是很正统~Repository也用得~~~~可以参考一下:nopCommerce
解决方案:
如果要改成不使用单例模式,工厂模式可以保留吧
解决方案:
现在思路:1、不使用单例模式,把所有的private类名改为public类名2、工厂方法中,把创建对象的方法,改为new的形式创建对象BLL和DAL层都要改,这样应该可以了吧。请指点

时间: 2024-08-30 12:02:13

EF连接数据库经常出现当前连接状态为打开的相关文章

[求助]使用EF连接数据库时,出现连接错误,请问这种错误是什么原因造成的?

问题描述 Executionofthecommandrequiresanopenandavailableconnection.Theconnection'scurrentstateisbroken.上面是错误提示,这是说连接断开了?什么原因造成的?下面是部分代码,是不是写法不正确?publicstaticclassVoteControl{privatestaticTeachEasEntitiesdb=newTeachEasEntities(Public.Dbase.DataBaseEFConn)

Centos查看apache,nginx并发连接数和TCP连接状态命令

netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态.  代码如下 复制代码 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'   或者:  netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}' FIN_WAIT2        38 CLOSING  

查看Apache并发请求数及其TCP连接状态

[文章作者:张宴 本文版本:v1.1 最后修改:2007.07.27 转载请注明出处:http://blog.s135.com] 这两天搭建了一组Apache服务器,每台服务器4G内存,采用的是prefork模式,一开始设置的连接数太少了,需要较长的时间去响应用户的请求,后来修改了一下Apache 2.0.59的配置文件httpd.conf: # prefork MPM# StartServers: number of server processes to start# MinSpareSer

iOS下的实际网络连接状态检测

序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部分iOS开发者来说,从苹果示例代码改变而来的各种Reachablity框架是实现这个需求的普遍选择,比如这个库.但事实上,基于此方案的所有实现,都无法帮助我们检测真正的网络连接状态,它们能检测的只是本地连接状态:这种情况包括但不限于如下场景: 1.现在很流行的公用wifi,需要网页鉴权,鉴权之前无法上网,但本地连接已经建立: 2.

listen-安卓设备如何监听蓝牙的连接状态

问题描述 安卓设备如何监听蓝牙的连接状态 如题,在我的APP中,成功将手机连接上了一个蓝牙串口,现在想监听它们之间的连接状态.在网上找到的方式都是用BroadcastReceiver来监听蓝牙状态改变的广播,于是我实现了这种方式,代码部分如下: private void registerBoradcastReceiver() { IntentFilter stateChangeFilter = new IntentFilter( BluetoothAdapter.ACTION_STATE_CHA

thernet-android中如何获取获取以太网连接状态

问题描述 android中如何获取获取以太网连接状态 有什么方法可以获取当前以太网是否连接的状态,已知现在EthernetManager类无法在应用层直接调用,那么有没有其他方法可以获取以太网是否连接的状态 解决方案 // 当网络变化的时候系统会发出一个广播 Broadcast,只要在程序中注册一个广播接收器 BroadcastReceiver,并在 IntentFilter 中添加相应的过滤,这样一旦网络有变化,程序就能监听到public static final String CONNECT

ubuntu系统:集群连接状态测试

一.集群连接状态测试 首先,我们回到管理节点(mysql-mgm.mtest.com)上.在该服务器上,执行下面的命令: $ ndb_mgm 命令执行后,就会进入MGM的客户端界面,并显示mgm提示符: -- NDB Cluster -- Management Client -- ndb_mgm> 在该提示符下,输入show命令,来查看当前连接状态: ndb_mgm> show 在正常情况下,应该显示如下内容: 从上述内容我们可以看到,两个NDB节点192.168.1.13和192.168.1

查看Windows7系统“网络连接”状态

在网络无法访问时,通常会习惯性地查看一下当前网络连接有没有什么异常,WinXP用户一般会直接点击桌面的网上邻居图标查看网络连接属性,然后查看本地连接的状态.但在Windows7系统桌面上看不到网上邻居图标,该怎样查看网络连接和本地连接状态呢?下面我们介绍几个Windows7系统中查看网络连接的方法和技巧,大家可以选择自己喜欢的使用. 方法一.控制面板 点击Windows7桌面左下角圆形开始按钮,然后选择"控制面板",再选择"网络和Internet"下面的"

Linux中通过Socket文件描述符寻找连接状态介绍

  Proc虚拟文件系统下面有许多数字命名的子目录,这些数字表示系统当前运行的进程号; 其中/proc/N/fd目录下面保存了打开的文件描述符,指向实际文件的一个链接.如下: 代码如下: [root@XXXXXXX_10_1_17_138 song_test]# ll /proc/25465/fd total 0 lrwx------ 1 root root 64 Apr 14 09:36 0 -> /dev/pts/4 (deleted) lrwx------ 1 root root 64 A