我的一个朋友在家里托管了一个ASP.NET 2.0应用程序,直到他搬了过来,我提出把它放在我自己的Win7 7/IIS7 7/SQLE2008r2服务器上。
当我将代码放到服务器上时,只需要几次请求,我就会得到以下错误:
超时过期了。从池获得连接之前经过的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。
首先,我找到了最大的池大小来临时“修复”这个问题。然后我仔细看了看他的代码。原来他从来没有给SqlConnection.Close()打过电话。因此,我添加了关闭和删除最大池大小从所有连接字符串,并解决了这个问题。
我问他是如何解决这个问题的,如果他以某种方式增加了服务器默认web.config或其他什么的每个默认情况下的最大池大小。他回答说".NET垃圾收集“。因此,他依靠垃圾收集来关闭他的数据库连接,并依靠他的服务器工作。但在我的身上却没有。
有人能解释原因吗?他正在度假,所以我不想打扰他,问他关于版本等的细节,但我猜他是在运行Win2k8。
发布于 2011-07-20 22:19:18
杰夫·阿特伍德有一篇关于这件事的精彩文章,我强烈推荐这篇文章。
依赖于.NET垃圾收集来关闭SQL连接是不可能的。应该始终调用SqlConnection.Close()和Dispose(),但至少应该调用Close()。关键字将自动为您处理对象(例如)。
依赖GC做任何事情都是不负责任和愚蠢的。这就像一起忽略内存,说“哦,当用户耗尽RAM时,他们可以重新启动!:D”。
在螺母外壳中,新部署站点上不工作的代码不是您的错。在这种情况下,它是不负责任的SQLConnection处理的编码器。
发布于 2011-07-20 22:26:09
依赖垃圾收集器关闭连接的问题是,您不能。
如果让垃圾收集器清理连接ojbects,则无法控制何时发生这种情况。垃圾收集器最终会关闭它们,但这取决于许多因素,例如,有多少可用内存,以及使用了多少内存。这些因素在不同的服务器之间是不同的,但它们也可能随着时间的推移而改变,因此您甚至不能指望垃圾收集器总是在同一台服务器上工作。
不同的数据库在有许多未关闭的连接时反应不同。例如,Access数据库对此非常敏感,不允许超过64个连接。
无论如何,您应该始终关闭连接和数据读取器。另外,您应该使用using块或try...finally块来确保连接总是关闭的,即使代码中有问题。
发布于 2011-07-20 22:44:01
只要垃圾收集的速度超过正在创建新连接的速率,将其留给垃圾收集器是非常好的。但我从未见过有人以这样的方式使用ASP.NET。
唯一不应该调用SqlConnection.Dispose的时间是绝对不能调用的。例如,从拥有它的类的析构函数中调用它会随机抛出一个异常,所以如果这是您唯一的希望,只需打开连接即可。
https://stackoverflow.com/questions/6769171
复制相似问题