ExecuteReader上出现Mysql异常

本文关键字:Mysql 异常 ExecuteReader | 更新日期: 2023-09-27 18:29:06

我的程序中出现了一个奇怪的异常,所以我试图复制它来向大家展示,所以我所做的是创建一个id为(int-11 primary)、title为(varchar-255)的表,并生成了长度为40个字符的100k个随机标题,当我运行读取每个id的计数的方法时,它会在下面抛出一个异常检查以了解更多信息。

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

  1. 设置net_write_timeout=99999;设置net_read_timeout=99999
  2. 已尝试的池=连接时为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;
            }
        }
    }
}

是什么原因造成的?有线索吗?

ExecuteReader上出现Mysql异常

所以最后我的解决方案是增加net_read_timeout变量(我指出net_write_timeout,因为执行长查询时也会发生这种情况)

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

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;
    }
}