我创建了一个自定义Windows服务,该服务基于mysql表中的队列来缓存新作业(进程,而不是线程)。 “职位”是数据库密集型应用程序以及服务(从现在开始,我将其称为“经理”)。
在大量工作期间(启动了许多“工作”),此错误开始出现的频率有所提高(估计影响20个工作中的约1个)。 “有趣的”是,发生此错误时,十分之九的错误发生在新作业的第一个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)
我的堆栈上的背景:
SQL连接字符串(非身份验证)设置:
我尝试过的事情:
SSL:针对此问题的大多数Google搜索都提出了与建议调整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不相关,尤其是因为禁用连接池似乎可以解决此问题。
谢谢您的帮助。
答案 0 :(得分:0)
您可以使用以下解决方案之一:
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
。