ExecuteReader上的Mysql异常

时间:2014-11-03 15:26:45

标签: c# mysql exception mysqldatareader

我的程序有一个奇怪的例外,所以我试图复制它来向你们展示,所以我做的是创建一个id(int-11 primary),title(varchar-255)并生成100k的表随机标题有40个字符lenght,当我运行我的方法读取每个id的计数时,它会抛出一个异常检查以获得更多。

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

  1. set net_write_timeout = 99999; set net_read_timeout = 99999;
  2. 连接时尝试pooling = true
  3. 尝试cmd.timeout = 120;
  4. 我还尝试添加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;
                }
            }
        }
    }
    

    导致这种情况的原因是什么?任何线索?

1 个答案:

答案 0 :(得分: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;
    }
}