【问题标题】:WCF using Nhibernate + Oracle fails to connect database intermittently使用 Nhibernate + Oracle 的 WCF 间歇性连接数据库失败
【发布时间】:2013-08-16 12:44:18
【问题描述】:

我们有一个使用 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_ 其中 stderrorme0_.ERR_NO=:p0 错误 发生---> System.InvalidOperationException:超时已过期。这 在从池中获取连接之前经过的超时时间。 这可能是因为所有池连接都在使用中,并且 已达到最大池大小。

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

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

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

【问题讨论】:

标签: asp.net wcf nhibernate oracle11g timeoutexception


【解决方案1】:

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

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

还请记住,如果您使用sessionFactory.OpenSession(IDbConnection) 重载,则您有责任关闭session.Close() 返回的连接。

【讨论】:

  • 感谢 Daniel,我们一定会在我们的 nHib 环境中检查此类未处置的对象。但令我们困惑的是,该应用程序在我们所有的测试环境中都能正常工作。只有在 Live 环境中部署时我们才会遇到这样的问题。所以我的一个疑问是,任何数据库配置或权限是否会导致这种情况..?
  • 也许实时环境获得更多流量,这意味着与数据库的更多连接?也许测试环境部署得更频繁,这意味着 WCF 重启更频繁?这绝对是 WCF 服务没有释放数据库连接的问题,因为重新启动它可以暂时解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多