2016-11-24 163 views
0

我只是检查有关连接超时堆栈溢出的其他职位,但看起来使用MySQL连接超时

com.CommandTimeout = int.MaxValue; 

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

不幸的是像其他人固定它,我仍然得到这个错误40秒后的消息:

在操作或服务器完成之前已经过去的超时时间不是响应G。

你可以看看这两个截图。

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

请在实例化dbaccess背后直到打开连接时显示完整代码。 – C4u

+0

如果将'int.MaxValue'更改为5000,会发生什么情况? –

+0

@SimonPrice同样的错误:( –

回答

0

你的问题就出在这行

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

在这里,您传递命令文本到新的个MySqlDataAdapter。当然,这有个MySqlDataAdapter没有你的命令集,因为三三两两(电源适配器和命令)没有连接在一起超时的知识。

如果更改为

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来说,非常明智的连接未关闭correctl y并且可以通过关于的错误消息来停止您的程序,不再有可用的连接

0

变化Pwdpassword。此外,属性server应设置为一个IP或域。

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

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

+0

@Steve谢谢,它的工作原理!我接受了关于“using”命令的建议,我会修改其余的mysql调用使用“using”。再一次,谢谢 –

+0

在'server'参数中,我使用的是计算机名称,因为它在itnernal网络或VPN上使用。我应该使用内部域名的FQDN吗?你在这里的推荐是什么?我愿意改进 –

+0

这很大程度上取决于你的软件。在本地网络上,我猜对其中的一个来说,它们没有什么大的好处。我通常会提供设置来更改数据库连接形式的用户端,这样这个问题就会消失。我可以肯定地说的唯一事情就是使用像FQDN或计算机名称(从未尝试过)的ip表示来保持连接,即使ip发生变化。 – C4u