2012-04-18 133 views
2

我正在使用最新的穩定MySql連接器/ NET 6.5.4.0。連接狀態MySql連接器/ NET

我打開了一個到MySQL數據庫的連接。在C#代碼中,Connection.State屬性爲Open。 我做了一些魔術stuf,而當我這樣做時,我殺死了連接服務器端。但是,在該州的代碼仍然是Open

我遇到了這個問題,因爲我將數據庫類的實例保存在每個會話(Dictionary)的靜態變量中。 如果用戶執行請求,則從該變量中提取數據庫類,並向其發出查詢。 但是,如果連接關閉服務器端(由de sysadmin殺死,等待超時已過),則狀態不會更新。

是否有解決此問題的方法?我的同事已經提交了一份bug報告(http://bugs.mysql.com/bug.php?id=64991)。

執行前關閉並打開,對性能非常不好,所以沒有選擇。

+0

你看過connection.Ping方法嗎?如果它是錯誤的,則連接關閉。 http://dev.mysql.com/doc/refman/5.0/en/connector-net-ref-mysqlclient.html#connector-net-ref-mysqlclient-mysqlconnection-ping您可能還想要訂閱StateChange事件連接來檢查發生了什麼。作爲一般建議,您可能不應將連接緩存爲靜態成員;只要連接池處於打開狀態,通過保持連接實例,您不應該看到任何有意義的性能增益。另外,如果發生了錯誤,會發生什麼情況? – dash 2012-04-18 09:44:30

+0

在這種情況下關閉連接池,我會研究Ping方法。如果連接關閉,我會收到'命令執行期間遇到致命錯誤' – 2012-04-18 09:55:12

+0

Ping()方法有效,但需要很長時間(每次調用0.020秒)。 StateChange事件被觸發得太晚(當調用執行閱讀器時)。 – 2012-04-20 09:16:32

回答

0

我建議你使用singelton模式進行連接。所以你可以確保總是隻有一個連接打開,你只需要管理這個連接。

+0

在這種情況下,我們不希望所有用戶都有一個連接,但每個用戶只需一個連接。 – 2012-04-18 09:55:49

1

暫且不論設計問題(確實應該池),根據您的評論:

連接池是在這種情況下關閉,我馬上去平 方法。如果此連接被關閉,我得到

的「命令執行過程中遇到致命錯誤 」是那裏,如果ping不通你不重新創建連接的任何原因?

private static MySqlConnection conn; 
private static int maxRetries; 

private static void connect() 
{ 
    conn = <connect code>; 
} 

private static MySqlConection GetConnectionRetry(int count) 
{ 
    if (conn != null && conn.State == Open) 
    { 
     try 
     { 
      conn.Ping(); 
      return conn; 
     } 
     catch (Exception e) // better be specific here 
     { 
      if (count <= maxRetries) 
      { 
       connect(); 
       return GetConnectionRetry(count + 1); 
      } 
      else throw e; 
     } 
    } 
    else 
    { 
     connect(); 
     return GetConnectionRetry(count + 1); 
    } 
} 

static MySqlConnection GetConnection() 
{ 
    return GetConnectionRetry(1); 
} 
+0

'Ping'方法需要很長時間。如果我必須在每個命令之前執行ping命令,那麼這是一個巨大的性能問題。 – 2012-04-20 09:17:18

+0

如果不執行ping操作,該怎麼辦?它仍然會拋出異常,其餘的邏輯將會接管。 – yamen 2012-04-20 13:22:00

+0

是的,我可以做到這一點,但在我看來,它仍然是一個非常規的解決方法 – 2012-04-25 07:10:54