2011-07-10 75 views
3

我们在使用SQL Express运行并处理多个并发的基于AJAX的请求的MVC3 Web应用程序上遇到与Nhibernate有关的连接池问题。Nhibernate连接池问题

每隔一段时间(小时之间),我们开始看到它的错误显示:

NHibernate.Util.ADOExceptionReporter
超时过期。在从池中获取连接之前已超时。发生这种情况的原因可能是因为所有连接池都在使用中,并且达到最大池大小。

然后在准备选择TOP(@ P0)
....
发生错误

我们必须回收IIS应用程序池的

负荷在此之后停止引发500个错误。

纵观SQL服务器,我们看到:

select * from sys.dm_exec_sessions 

...给约30会话使用标识上面51(即用户会话)

select * from sys.dm_exec_connections 

...给周围的相同数额

BUT

select @@connections 

...给出结果79022

这是否表明连接永不释放?

Nhibernate会话是请求的整个生命周期。

有没有人有这样的经验或可以指出我们在正确的方向吗?

非常感谢

理查德

回答

4

你不能有更多然后32767连接到SQL Server。

@@CONNECTIONS也给了(我的粗体)

返回连接尝试,无论成功或失败,因为SQL服务器上次启动的次数。

不是当前连接

我怀疑你的池设置不正确,所以它耗尽太快。

或者您没有正确释放连接,并且在回收IIS后检查SQL Server。

+0

+1关于释放连接;检查为每个请求分配和释放会话的代码,并确保您正确地处理会话。 –

+0

@理查德:谢谢你的接受。我会对你在调查中发现的内容感兴趣 – gbn

+0

我发现我必须将连接池数从100增加到200,并且此后不再有这些错误。因为我相信该应用程序不应该需要这么多,但嘿,不是完全满意。有用。 – Richard