C# Dapper & MySQL 随机错误,即致命错误/从流中读取失败等

C# Dapper & MySQL random error i.e. fatal error / reading from the stream has failed, etc

我正在使用带有 MySQL & Dapper 的 .net 核心工作者应用程序 (3.1)。

这不是一个新问题,我遇到它已经超过 1 年了,从来没有造成大问题,因为任务总是会重试。

但是现在我正在开发新功能,必须在几秒钟内处理 > 300-600k 行,连接到数据库数百次。

问题是我可以在日志中随机看到 MySQL.Data.MySqlClient.MySqlExceptions(通过 Dapper 获取记录或执行 SQL 命令)。

它们都是通用的,除了流失败和操作被取消之外没有任何其他内容。

最奇怪的问题是它只发生在 Linux 环境中(客户端是 MySQL 实例的本地)。 当我 运行 它在 Windows 上(通过 VS 或 Docker 图像)时,它 运行 对于 > 30 倍大的测试负载来说很好。

当我部署到 linux(使用来自 Microsoft 的 3.1 aspnet 图像的相同 docker 图像)时失败。

我测试了一下直接发布到 ubuntu & dotnet 运行 dll 并且工作正常,但我只试了 ~ 10 次。

所以不是什么大考验。

知道我应该看哪里吗?我试图确保 Dapper query exec 将使用打开的连接,但事实并非如此。也有重试,但有时第一次试就很好,有时会重试2次,有时会连续5次失败20次。

无法查明此问题,不确定这是 Dapper 还是 Microsoft 图像在 Linux 上 运行 不是坚如磐石......

Reading from the stream has failed 是针对 Oracle 的 MySQL Connector/NET: bug 75917, bug 76597 经常报告的错误。有些人针对这些错误报告报告了各种解决方法。

我建议切换到 MySqlConnector, an OSS alternative ADO.NET library for MySQL that supports .NET Core, true async I/O, and fixes many Connector/NET bugs

好的伙计们,我找到了解决方案...

首先感谢大家对我的帮助。

原因?

至少奇怪...

原来有超过 15 个不同的 services/apps 使用了一段时间前创建的同一个库。这是一个从源构建的帮助程序库,但出于某种原因,它是使用依赖项 .net 框架/.net 核心创建的。 此外,另一个库正在使用正确的 .net 核心库。

这些库基本上对所有应用程序都是隐藏的,因为它们会作为依赖项被拉出来。

有时应用程序会使用依赖于 .net 框架的损坏的库,在这种情况下 MySQL 会因所有这些不同的错误而崩溃(这就是我无法查明原因的原因其中)。在开发中它有效,但对于开发我们正在使用 Windows,这就是为什么我们无法在行为中捕捉到它。

这就是为什么有些应用程序会以一种奇怪的方式冻结并在负载下导致很多问题。

清除了损坏的库,修复了依赖项...

现在可以完美运行 > 14 小时(在恒定负载测试场景下。没有一个错误。