【问题标题】:Error reading data from the connection从连接读取数据时出错
【发布时间】:2018-06-07 05:40:42
【问题描述】:

我们已经编写了几个连接到我们内部 Firebird 2.5.5 数据库的 C# Web 服务。

不幸的是,“从连接读取数据时出错”异常越来越频繁地抛出,我们不知道如何修复它。

我们尝试禁用池,但这并没有达到预期的效果。

我们还编写了一个 try catch 块来重新连接并重新执行 SQL,但这在我们看来不是正确的解决方案。

还有其他选择吗?

以下是一些环境信息:

  • C# 7.0
  • .NET 4.5
  • 火鸟版本 2.5.5
  • 火鸟驱动程序 5.5.0
  • Firebird 日志当时没有显示任何错误消息
  • 任何sql语句都会时不时发生错误

【问题讨论】:

  • 尝试专门捕获FbException 并检查ErrorCode 属性。这至少可以提供有关问题原因的更多信息(请参阅firebirdsql.org/pdfrefdocs/Firebird-2.1-ErrorCodes.pdf) - 或者您只能在 335544726 时重新连接。
  • Stacktrace: ... { "Message": null, "ErrorCode": 335544726, "StrParam": "", "Type": 1, "IsArgument": false, "IsWarning": false }, { "Message": "从连接读取数据时出错。", "ErrorCode": 335544726, "StrParam": "", "Type": 0, "IsArgument": false, "IsWarning": false } ], “错误代码”:335544726 }
  • 你可以通过重新连接ErrorCode == 335544726来“改进”黑客攻击。我在 firebird 页面上找不到原始错误报告,但我记得几年前它的状态是“无法修复”。
  • 好的,谢谢,但我应该如何处理交易?

标签: c# firebird


【解决方案1】:

问题相对简单:客户端和服务器之间的网络连接由于某种原因中断或中断,但客户端连接的State 仍然是Open - 即使您不能再使用该连接。不幸的是,Firebird 决定不自动将此状态更新为Broken,如果您问我,这会更有意义。

您已经发现重新打开连接“在一定程度上解决了”问题,并且我们已经讨论过您只能在 FbException.ErrorCode 为 335544726 时执行此操作。

不幸的是,这确实意味着任何打开的事务也会丢失,并且您不能再提交任何数据。我能想到的从这种情况中可靠恢复的唯一方法是重新抛出异常:

try
{
    // ...
}
catch (FbException ex)
{
    if (ex.ErrorCode == 335544726)
    {
        // close the connection (reopen depending on your application)
    }

    throw;
}

这样,您可以在应用程序的更高级别捕获此异常,并在此时适当地处理它 - 即。重试整个事务,或者让用户选择要做什么。

【讨论】:

  • 如果这种情况越来越频繁,那么我会高度怀疑Web服务器和数据库之间网络的可靠性,或者Firebird进程是否经常崩溃。
猜你喜欢
  • 1970-01-01
  • 2018-02-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多