gpt4 book ai didi

c# - 如何在 .NET 中修复 'Authentication to host for user using method ' mysql_native_password' failed with message : Reading from the stream has failed.'

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:43 24 4
gpt4 key购买 nike

我已经创建了一个自定义的 Windows 服务,它基于 mysql 表中的队列来假脱机处理新作业(进程,而不是线程)。 “作业”是数据库密集型应用程序和服务(从现在起我将其称为“管理器”)。

在高容量期间(许多“作业”被启动),此错误开始发生,而且频率有点高(估计大约每 20 个作业中就有 1 个受到影响)。 “有趣”的是,当这个错误发生时,10 次中有 9 次是在新作业的第一个 SQL 命令中。我不认为我在经理身上看到过这种情况。极少数情况是在作业中间抛出此错误(每个作业正在执行数十条 SQL 命令)。

MySql.Data.MySqlClient.MySqlException (0x80004005): Authentication to host '***' for user '***' using method 'mysql_native_password' failed with message: Reading from the stream has failed. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed. ---> System.IO.EndOfStreamException: Attempted to read past the end of the stream.
at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.AuthenticationFailed(Exception ex)
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.ReadPacket()
at MySql.Data.MySqlClient.Authentication.MySqlAuthenticationPlugin.Authenticate(Boolean reset)
at MySql.Data.MySqlClient.NativeDriver.Authenticate(String authMethod, Boolean reset)
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at MySql.Data.MySqlClient.MySqlHelper.ExecuteReader(String connectionString, String commandText, MySqlParameter[] commandParameters)

我的堆栈背景:

  • Windows Server 2016(这是运行管理器和作业的平台)
  • MySql.Data 6.10.8(用于 .NET SQL 集成的 nuget 包)

SQL 连接字符串(非授权)设置:

  • 加密=假;
  • AllowZeroDatetime=true;
  • CheckParameters=false;

我尝试过的事情:

  • SSL:针对此问题的大多数谷歌搜索都得出完全相同的建议调整 SSL 设置的帖子。我将只包含一个链接:http://www.voidcn.com/article/p-phfoefri-bpr.html (建议的解决方案都不适合我)

  • 连接池配置:我成功地禁用了连接池(例如,将“Pooling=false;”添加到连接字符串),但我担心这不是一个好的长期解决方案。我希望能够使用和理解连接池,因为它具有性能优势。当然,禁用连接池不是解决此问题的唯一方法。还有其他与连接池相关的设置,例如“连接重置”,但我对使用它们的理解还不够好,而且我发现每个参数的 sql 文档都太简短,无法真正掌握。我尝试增加 MaxPool 设置,但没有任何效果。还有“ConnectionTimeout”设置,它设置连接在中止之前等待服务器响应的时间量......我对此有疑问,当 sql cmd 正在等待池连接打开时,它是否只等待“CommandTimeout”秒?

我运行的所有 sql 命令都像这样使用 MySqlHelper 类(我的一些命令只是以非常相似的方式使用 ExecuteNonQuery):

using (MySqlDataReader sqlRdr = MySqlHelper.ExecuteReader(connString, cmdText, sqlParams.ToArray()))
{
while (sqlRdr.Read())
{
ret.Add(getFromRdr(sqlRdr));
}
}

我在“解决”这个错误时遇到了麻烦。我所做的大部分查找此异常的研究都只是回到关于调整 SSL 设置的同一篇文章。我的问题似乎与 SSL 无关,尤其是因为禁用连接池似乎可以解决此问题。

提前感谢您的帮助。

最佳答案

您可以使用以下解决方案之一:

  1. 在玩具应用程序启动时添加 ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
  2. 可能是“远程数据库访问主机”的问题。 “您可以通过将外部 Web 服务器的域名添加到能够访问您网站上的数据库的主机列表来允许外部 Web 服务器访问您的 MySQL 数据库。”

关于c# - 如何在 .NET 中修复 'Authentication to host for user using method ' mysql_native_password' failed with message : Reading from the stream has failed.',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56260702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com