【问题标题】:MySqlClient blacklisting server in ServerPoolServerPool 中的 MySqlClient 黑名单服务器
【发布时间】:2015-03-22 16:14:21
【问题描述】:

.NET MySqlClient (6.9.5.0) 中是否有任何内容,当服务器池中的 MySQL 服务器没有响应(可能是由于临时网络问题)时,服务器被永久列入黑名单或绕过?在我们的日志记录中,我们注意到抛出了一个身份验证错误:

MySql.Data.MySqlClient.MySqlException (0x80004005): Authentication to host '<HOST>' for user '<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.

发生此错误后,每次尝试从数据库写入或读取都会失败,并显示以下错误消息:

MySql.Data.MySqlClient.MySqlException (0x80004005): No available server found.

有什么想法吗?当数据库服务器被移动到运行我们的应用程序的同一台主机上时,问题就不再发生了。

【问题讨论】:

  • 这是否与bug有关:bugs.mysql.com/bug.php?id=72110
  • 我不这么认为。类似的症状,但我们不做他们在文章中提到的事情。
  • 会不会和这个bug有关? bugs.mysql.com/bug.php?id=52314
  • 如果您的连接池在您丢失网络之前打开了所有潜在连接(来自连接字符串的最大池大小)。Net(或 MySQL)可能会通过假设主机拒绝创建任何新连接已经具有所需/允许的最大连接数/资源数。您是否在连接停止工作之前和之后检查了 SHOW PROCESSLIST 以查看您的所有连接是否在“已终止”或其他等待状态下保持打开状态?见:psce.com/blog/2012/05/15/…

标签: c# mysql database


【解决方案1】:

这里有两件事让我印象深刻:

  1. 您的异常的性质:System.IO.EndOfStreamException: 试图读取超过流的末尾。

  2. 事实上,当数据库与数据库位于同一台机器上时 调用应用程序,您不会遇到问题。

对我来说,这告诉我正在发生与传输或网络相关的错误,这会中断您的直播。一旦发生这种情况,您的连接将被重置,因此对 DB 的后续调用将失败。

我会尝试捕获 EndOfStreamException,并尝试优雅地关闭和重新打开连接。像下面的东西。如果这允许后续调用成功,那么您已经发现了问题......尽管请记住,在此结构中,原始调用(在 try 块内)不会再次被调用。在进行后续调用之前,您还需要正确地重新创建并打开您的连接,因为它现在总是被释放在 finally 块中。

try
{
    //your work
}
catch (System.IO.EndOfStreamException ex)
{
    System.Diagnostics.Debug.WriteLine("Stream exception caught: " + ex.Message.ToString());


}
finally
{
    if(myConnection != null)
    {
        myConnection.Close();
        myConnection.Dispose();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2018-11-24
    • 1970-01-01
    • 2020-02-01
    • 2014-07-06
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多