[英]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;
}
更改Pwd
到password
。 此外,屬性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.