【发布时间】:2017-04-09 22:28:45
【问题描述】:
我正在托管一个 ASP.NET Web API,该 API 已经投入生产多年,并且已经看到了数十次更新。突然之间,只对代码进行了微小的更改,API 在恰好 50 个请求后崩溃,无论使用哪个浏览器或客户端。 Web 服务器重新启动会立即恢复 API 可用性(应用程序池回收不会),但神秘的倒计时重新开始......
这种奇怪的效果在多台机器(Windows Server 2008、Windows Server 2013 和 Windows 7)和不同的 Web 服务器(IIS 7.5、IIS 8.5、UltiDev Web Server)上持续存在。 IDE 是 Visual Studio Community 2015; .NET 版本是 4.5.2。
我没有添加外部 API 依赖项。我怀疑 Firebird(唯一的外部依赖项)施加了“50”的限制,但我所有的实验和谷歌搜索都无济于事。
我可以提取的唯一中途有用的日志消息是数据库连接由于超时错误而失败。 (我正在使用 Firebird 2.5 SuperServer x64 和 Firebird .NET Provider 以及 3.0.2 版的 FirebirdSql.Data.FirebirdClient.dll,到目前为止它对我很有帮助。)不过,我可以连接到数据库并通过 FlameRobin 浏览它。无论如何,只要我回到以前的 API 版本,一切都会正常运行。
崩溃后,之前清除的 firebird.log 包含 50 条相同的消息,如下所示:
AB-01234-CD (Server) Fri Nov 25 14:22:57 2016
INET/inet_error: read errno = 10054
我已经提到,该问题在具有独立本地数据库的不同系统中仍然存在。数据库备份/恢复是没用的,就像重启 Firebird 服务一样。只需要重启网络服务器即可。
感谢您的任何想法...
【问题讨论】:
-
我想你没有处理你的连接并且正在最大化连接池。虽然没有代码,这是一个猜测
-
我同意 Liam 的观点 - 听起来您没有关闭/处置 SqlConnections 或其他类似的东西,并且连接池已满。
-
错误 10054 是由对等方重置的 (winsock) 连接。如果您有一个连接池(Firebird ado.net 提供程序默认拥有该连接池),并且池中打开了 50 个连接,那么应用程序的崩溃将突然终止套接字,从而导致 Firebird 服务器记录这些错误。 Firebird 本身不施加连接限制,除了 Windows 上的 Firebird SuperServer 限制为最大 1024(或较新版本为 2048)。我只能建议你仔细检查工作版本和非工作版本之间的变化。
标签: c# asp.net firebird firebird2.5