1

好吧,我的程序有一个奇怪的异常,所以我试图复制它给你们看,所以我所做的是创建一个带有 id(int-11 primary)、title(varchar-255) 的表并生成 100k 个随机标题40 个字符长度,当我运行读取每个 id 计数的方法时,它会在下面抛出异常检查以获取更多信息。

我发现这是因为超时所以我尝试了这个超时。

  1. 设置 net_write_timeout=99999;设置 net_read_timeout=99999;
  2. 在连接上尝试 pooling=true
  3. 试过 cmd.timeout = 120;

我还尝试添加我玩过多个值的 MaxDegreeOfParallelism,但一段时间后仍然出现相同的错误。

我的例外:

无法终止查询,正在中止连接。异常是无法从传输连接中读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。

public static string db_main = "Server=" + server + ";Port=" + port + ";Database=" + database_main + ";Uid=" + user + ";Pwd=" + password + ";Pooling=true;";

private void button19_Click(object sender, EventArgs e)
{
    List<string> list = db.read_string_list("SELECT id from tablename", db.db_main);
    //new ParallelOptions { MaxDegreeOfParallelism = 3 },
    Task.Factory.StartNew(() =>
    {
        Parallel.ForEach(list, id =>
        {
            string sql = "SELECT COUNT(*) FROM tablename where id=" + id;
            var ti = db.read_int(sql, db.db_main);
            Console.WriteLine(ti);
        });
    }).ContinueWith(_ =>
    {
        Console.WriteLine("Finished");
    });
}

public static int? read_int(string sql, string sconn)
{
    var rdr = MySqlHelper.ExecuteReader(db.db_main, sql);
    if (rdr.HasRows)
    {
        rdr.Read();
        return rdr.GetInt32(0);
    }
    else
        return null;
}

使用超时选项读取 int 的替代方法。

public static int? read_int2(string sql, string sconn)
{
    using (var conn = new MySqlConnection(sconn))
    {
        using (var cmd = new MySqlCommand(sql, conn))
        {
            //cmd.CommandTimeout = 120;
            conn.Open();
            using (var rdr = cmd.ExecuteReader())
            {
                if (rdr.HasRows)
                {
                    rdr.Read();
                    return rdr.GetInt32(0);
                }
                else
                    return null;
            }
        }
    }
}

这可能是什么原因造成的?任何线索?

4

1 回答 1

1

所以最后我对此的解决方案是增加 net_read_timeout 变量(我指出 net_write_timeout 因为这也可能在执行长查询时发生)

运行这些查询*注意:重新启动 PC 后,默认值将再次出现。

set @@global.net_read_timeout = 999;
set @@global.net_write_timeout = 999;

或者您可以在连接字符串上添加它

default command timeout=999;

最后我用这个方法来读取值。

public static int? read_int(string sql, string sconn)
{
    try
    {
        using (MySqlDataReader reader = MySqlHelper.ExecuteReader(sconn, sql))
        {
            if (reader.HasRows)
            {
                reader.Read();
                return reader.GetInt32(0);
            }
            else
                return null;
        }
    }
    catch (MySqlException ex)
    {
        //Do your stuff here
        throw ex;
    }
}
于 2014-11-11T18:23:11.923 回答