【发布时间】:2019-10-09 04:06:28
【问题描述】:
我创建了一个自定义 Windows 服务,它基于 mysql 表中的队列来处理新作业(进程,而不是线程)。 “作业”是数据库密集型应用程序以及服务(从现在开始我将其称为“管理器”)。
在高容量期间(许多“作业”正在启动),此错误开始发生,而且频率很高(估计大约有 20 个作业受到影响)。 “有趣”的事情是,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 无关,尤其是因为禁用连接池似乎可以解决此问题。
提前感谢您的帮助。
【问题讨论】:
-
凹凸凹凸
-
你有解决办法吗?
标签: c# sql asp.net ssl connection-pooling