我们编写了几个与我们的内部Firebird 2.5.5数据库连接的C#Web服务。
不幸的是,异常“从连接读取数据时出错”的情况越来越频繁,我们不知道如何修复它。
我们尝试禁用池,但这没有达到预期的效果。
我们还编写了一个try catch块来重新连接并重新执行SQL,但我们认为这似乎不是正确的解决方案。
还有其他选择吗?
以下是一些环境信息:
答案 0 :(得分:0)
问题相对简单:由于某种原因,客户端和服务器之间的网络连接中断或中断,但客户端连接的State
仍为Open
- 即使您不能再使用该连接。不幸的是,Firebird决定不自动将此状态更新为Broken
,如果你问我,这会更有意义。
您已经发现重新打开连接会“稍微解决”问题,我们已经讨论过只有在FbException.ErrorCode
为335544726时才能执行此操作。
不幸的是,这确实意味着任何打开的事务也会丢失,并且您无法再提交任何数据。我能想到从这种情况中可靠恢复的唯一方法是重新抛出异常:
try
{
// ...
}
catch (FbException ex)
{
if (ex.ErrorCode == 335544726)
{
// close the connection (reopen depending on your application)
}
throw;
}
通过这种方式,您可以在应用程序的更高级别捕获此异常,然后处理它也适用于此 - 即。重试整个交易,或让用户选择做什么。