【问题标题】:Why is my C#/MySQL connection timeout setting being ignored?为什么我的 C#/MySQL 连接超时设置被忽略?
【发布时间】:2020-08-25 21:31:04
【问题描述】:

我有一个长时间运行的查询,从 MySQL 普通客户端完成大约需要 1 分钟。

但是,当我在我的 C# 应用程序中运行它时,尽管在连接字符串中将其设置为 240 秒,但 30 秒后似乎出现标准 MySQL 连接超时错误。

我找不到其他超时设置吗?

错误信息

异常:“在命令执行期间遇到致命错误。”

InnerException:“从流中读取失败。”

InnerException: "Unable to read data from the transport connection: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应。"

代码

public static string GetMySQLconnectionString()
{
    MySqlConnectionStringBuilder conn_string = new MySqlConnectionStringBuilder();

    conn_string.Server             = "127.0.0.1";
    conn_string.Port               = 4302;
    conn_string.UserID             = "root";
    conn_string.Password           = "";
    conn_string.Database           = "my_database";
    conn_string.CharacterSet       = "utf8";
    conn_string.SslMode            = MySqlSslMode.None;
    conn_string.ConnectionTimeout  = 240;

    return conn_string.ToString();
}

internal static string getTotalSitesThatStillNeedDNSChecking()
{
    try
    {
        using (MySql.Data.MySqlClient.MySqlConnection dbConnUpdate = new MySql.Data.MySqlClient.MySqlConnection(GetMySQLconnectionString()))
        {
            dbConnUpdate.Open();
            MySqlCommand command = dbConnUpdate.CreateCommand();
            command.CommandText = "SELECT count(*) as counter FROM all_domains WHERE last_dns_check IS NULL";
            MySqlDataReader reader = command.ExecuteReader();

            if (!reader.HasRows) return "0";

            reader.Read();

            return (string)reader["counter"].ToString();
        }
    }
    catch (Exception ex) { Logger.AddError("error - ", ex, "grand-total-stat-calculator"); return "0"; }
}

【问题讨论】:

  • 您遇到的是连接失败,而不是实际查询超时。而不是使用 127.0.0.1 使用计算机的 IP 或计算机名称。并非所有机器都配置为环回 IP 地址 127.0.0.1。你是在 OPEN 还是 SELECT 上失败了?
  • 谢谢,但我可以看到 SQL 查询正在运行,但它只是在 30 秒后抛出该错误,所有其他查询都可以正常运行,只是运行时间不长
  • 该命令的默认超时时间为 30 秒。更改命令超时。
  • 尝试将本地ip改为“localhost”
  • ConnectionTimeout 仅为初始连接设置超时,而不为在该连接上执行的任何后续命令设置超时。

标签: c# mysql database


【解决方案1】:

需要像这样设置CommandTimeout

    try
    {
        using (MySql.Data.MySqlClient.MySqlConnection dbConnUpdate = new MySql.Data.MySqlClient.MySqlConnection(GetMySQLconnectionString()))
        {
            dbConnUpdate.Open();
            MySqlCommand command = dbConnUpdate.CreateCommand();
            command.CommandTimeout = 240;
            command.CommandText = "SELECT count(*) as counter FROM all_domains WHERE last_dns_check IS NULL";
            MySqlDataReader reader = command.ExecuteReader();

            if (!reader.HasRows) return "0";

            reader.Read();

            return (string)reader["counter"].ToString();
        }
    }
    catch (Exception ex) { Logger.AddError("error - ", ex, "grand-total-stat-calculator"); return "0"; }

【讨论】:

  • 您还可以在连接字符串中设置DefaultCommandTimeout,以便为所有命令自动设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2023-03-30
  • 2020-10-22
  • 2012-02-03
相关资源
最近更新 更多