0

我们有一个使用 WCF 开发的 3 层应用程序。我们的 Web 层 [32 位 Windows 2003 Sp1] 调用 WCF 服务 [NLB 上的 64 位 Windows 2008 R2],它与 Oracle 10g DB [64 位 Linux] 通信。DB 连接是使用 Nhibernate 2.2 建立的。WCF 通信使用 BasicHTTPBinding。

在 32 位测试环境中,应用程序运行良好,但在上面指定的 Live 环境中,我们遇到了崩溃。根据记录,重复错误是,

System.ApplicationException :> 内部异常

NHibernate.ADOException:在准备选择 stderrorme0_.ERR_NO 作为 ERR1_10_,stderrorme0_.ERR_TYPE 作为 ERR2_10_,.... ....,从 STD_ERROR_MESSAGE stderrorme0_ where stderrorme0_.ERR_NO=:p0 发生错误---> System.InvalidOperationException:超时已到期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。

此错误重复,只是正在获取的表发生更改。

临时解决方案:重新启动托管在 IIS 中的 WCF 服务。

请帮助我们提出您的建议和解决方案,以使其发挥作用。这篇文章是在各种博客之后经过如此多的试验和错误后提出的。

4

1 回答 1

0

这几乎可以肯定是因为没有正确处理连接(https://stackoverflow.com/a/5442062/221708),在您的情况下,这可能是由于未正确处理 NHibernate 会话造成的。就像您应该将连接包装在using块中一样,您应该将 NHibernate 会话包装在using块中。

这里有几篇关于在 WCF 中管理 NHibernate 会话的好文章:

还要记住,如果您使用sessionFactory.OpenSession(IDbConnection)重载,您有责任关闭由session.Close().

于 2013-08-16T17:42:34.517 回答