繁体   English   中英

C#上的MySQL连接超时

[英]MySQL Connection timeout on C#

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

com.CommandTimeout = int.MaxValue;

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

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

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

你可以看看这两个截图。

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

错误信息

工作台

我无法使用限制来减少获取的子集,因为我正在集中分析在不同表中的信息。 由于信息也存储在不同的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;
}

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

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

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

你的问题在于这一行

 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,并且可以使用关于不再有可用连接的错误消息来停止程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM