首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql在ExecuteReader上的异常

Mysql在ExecuteReader上的异常
EN

Stack Overflow用户
提问于 2014-11-03 15:26:45
回答 1查看 1.5K关注 0票数 1

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

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

  1. 设置net_write_timeout=99999;设置net_read_timeout=99999;
  2. 在连接上尝试使用pooling=true
  3. 尝试cmd.timeout =12 0;

我还尝试添加MaxDegreeOfParallelism,我使用了多个值,但在一段时间后仍然会出现相同的错误。

我的例外:

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

代码语言:javascript
复制
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的替代方法.

代码语言:javascript
复制
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;
            }
        }
    }
}

是什么导致了这一切?有什么线索吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-11 18:23:11

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

运行这些查询*注意:在您重新启动您的PC后,默认值将再次发生。

代码语言:javascript
复制
set @@global.net_read_timeout = 999;
set @@global.net_write_timeout = 999;

也可以将其添加到连接字符串中。

代码语言:javascript
复制
default command timeout=999;

最后,我使用此方法读取这些值。

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26717364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档