我的一个朋友在家里托管了一个ASP.NET 2.0应用程序,直到他搬了过来,我提出把它放在我自己的Win7 7/IIS7 7/SQLE2008r2服务器上。
当我将代码放到服务器上时,只需要几次请求,我就会得到以下错误:
超时过期了。从池获得连接之前经过的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。
首先,我找到了最大的池大小来临时“修复”这个问题。然后我仔细看了看他的代码。原来他从来没有给SqlConnection.Close()打过电话。因此,我添加了关闭和删除最大池大小从所有连接字符串,并解决了这个问题。
我问他是如何解决这个问题的,如果他以某种方式增加了服务器默认web.config或其他什么的每个默认情况下的最大池大小。他回答说".NET垃圾收集“。因此,他依靠垃圾收集来关闭他的数据库连接,并依靠他的服务器工作。但在我的身上却没有。
有人能解释原因吗?他正在度假,所以我不想打扰他,问他关于版本等的细节,但我猜他是在运行Win2k8。
发布于 2011-07-20 22:26:09
依赖垃圾收集器关闭连接的问题是,您不能。
如果让垃圾收集器清理连接ojbects,则无法控制何时发生这种情况。垃圾收集器最终会关闭它们,但这取决于许多因素,例如,有多少可用内存,以及使用了多少内存。这些因素在不同的服务器之间是不同的,但它们也可能随着时间的推移而改变,因此您甚至不能指望垃圾收集器总是在同一台服务器上工作。
不同的数据库在有许多未关闭的连接时反应不同。例如,Access数据库对此非常敏感,不允许超过64个连接。
无论如何,您应该始终关闭连接和数据读取器。另外,您应该使用using块或try...finally块来确保连接总是关闭的,即使代码中有问题。
https://stackoverflow.com/questions/6769171
复制相似问题