簡體   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