我只是查看关于连接超时的堆栈溢出的其他帖子,但看起来每个人都使用
修复它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;
}
答案 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,并且可以使用关于不再有可用连接的错误消息来停止程序。