C#上的MySQL连接超时

时间:2016-11-24 09:58:13

标签: c# mysql timeout

我只是查看关于连接超时的堆栈溢出的其他帖子,但看起来每个人都使用

修复它
com.CommandTimeout = int.MaxValue;

dbaccess.ServerAddress = "Server=mysql;Database=MyDB;Connect Timeout=2147483;Uid=username;Pwd=mypassword";

不幸的是,我在40秒后仍然收到此错误消息:

  

操作完成之前经过的超时时间或服务器没有响应。

您可以查看两个屏幕截图。

MySQL Workbench工作正常,执行相同的查询需要48秒。

ErrorMessage

Workbench

我无法使用限制来减少获取的子集,因为我正在集中分割在不同表中的信息。由于信息也存储在不同的mysql服务器中,因此无法使用存储过程。

非常感谢任何反馈。

费尔南多

编辑:

这是代码。我发布了图像以显示执行时间,而不是错误消息。

public DataSet ExecuteQuery(string[] Query,  TableMap[] TableMappings)
{
    //Mysql vars
    MySqlConnection con;
    MySqlCommand com;
    MySqlDataAdapter adapter;
    DataSet ds;

    con = new MySqlConnection();
    con.ConnectionString = _serveraddress;

    con.Open();

    com = con.CreateCommand();
    com.CommandType = System.Data.CommandType.Text;

    foreach (string st in Query)
    {
        com.CommandText = com.CommandText + st;
    }

    com.CommandTimeout = int.MaxValue;

    adapter = new MySqlDataAdapter(com.CommandText, con);

    foreach (TableMap tm in TableMappings)
    {
        adapter.TableMappings.Add(tm.SourceTable, tm.TableSet);
    }

    ds = new DataSet();
    adapter.Fill(ds);

    return ds;
}

2 个答案:

答案 0 :(得分:0)

Pwd更改为password。此外,属性server应设置为ip或域。

conn = "Server=[ip/domain];...password=mypassword";

错误的凭据会导致登录失败,而不是超时。我想它确实试图连接到mysql。如果服务器在本地计算机上运行,​​只需将localhost设置为服务器。

答案 1 :(得分:0)

你的问题在于这一行

 adapter = new MySqlDataAdapter(com.CommandText, con);

在此处将命令文本传递给新的MySqlDataAdapter。当然,这个MySqlDataAdapter不知道你在命令上设置的超时,因为twos(适配器和命令)没有链接在一起。

如果您更改为

 adapter = new MySqlDataAdapter(com);

然后您的适配器将使用MySqlCommand及其CommandTimeout属性

说,我真的建议你按照完善的模式开始接近数据库代码

public DataSet ExecuteQuery(string[] Query,  TableMap[] TableMappings)
{
    // using statement will ensure proper closing and DISPOSING of the objects
    using(MySqlConnection con = new MySqlConnection(_serveraddress))
    using(MySqlCommand com = con.CreateCommand())
    {
        con.Open();
        // Not needed, it is the default
        // com.CommandType = System.Data.CommandType.Text;

        foreach (string st in Query)
        {
            // Are you sure the st is properly terminated with a semicolon?
            com.CommandText = com.CommandText + st;
        }
        com.CommandTimeout = int.MaxValue;
        using(MySqlDataAdapter adapter = new MySqlDataAdapter(com))
        {
            foreach (TableMap tm in TableMappings)
               adapter.TableMappings.Add(tm.SourceTable, tm.TableSet);

            DataSet ds = new DataSet();
            adapter.Fill(ds);
            return ds;
       }
    }
}

using语句在这里非常重要,尤其是对于未正确关闭的连接非常敏感的MySql,并且可以使用关于不再有可用连接的错误消息来停止程序