NHibernate 连接池问题

3
我们在运行使用SQL Express的MVC3 Web应用程序时,使用Nhibernate处理多个并发的基于AJAX的请求时,遇到了一些连接池问题。

偶尔会出现错误,显示:

NHibernate.Util.ADOExceptionReporter
超时已过期。在从池中获取连接之前已经超过了超时时间。这可能是因为所有池化连接都正在使用且已达到最大池大小。

然后会出现一系列的:

准备选择select TOP (@p0)
....
出现错误

此后我们必须重新启动IIS应用程序池,以防止抛出500错误。

查看SQL Server,我们发现:

select * from sys.dm_exec_sessions

...给出了超过51的ID(即用户会话)大约30个会话。

select * from sys.dm_exec_connections 

...大致提供相同的数量

但是

select @@connections

...给出了79022个结果。

这是否意味着连接从未被释放?

Nhibernate会话的生命周期为请求期间。

是否有任何人有类似的经验,或者可以指引我们正确的方向?

非常感谢。

Richard

1个回答

6

您不能连接超过32767个SQL Server。

@@CONNECTIONS也提供了以下信息(我加粗了)

返回自上次启动SQL Server以来尝试连接的次数,无论成功或失败。

这不是当前连接数。

我怀疑您的连接池设置不正确,导致它很快被耗尽。

或者您没有正确释放连接,并且在重新启动IIS后检查了SQL Server。


+1 关于释放连接的建议;请检查分配和释放会话给每个请求的代码,并确保正确地处理了会话的释放。 - JT.
@Richard:谢谢您的接受。我很感兴趣了解您在调查中发现了什么。 - gbn
我发现我必须将连接池计数从100增加到200,此后再也没有出现这些错误。虽然我不完全满意这个解决方案,因为我认为应用程序不应该需要这么多,但是它确实有效。 - Richard
@Richard:这可能只是因为在峰值负载时您有100多个活动连接,这对于您的系统来说是完全正常的。 - gbn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接