2013-02-07 32 views
0

我試圖使用連接池對MySQL的.NET連接器6.6.4.0使用下面的代碼來投放多個線程:測試C#MySQL連接池失敗例外:連接必須是有效和開放的

static public uint uNonQuery(string query) 
     { 

       using (Connection = new MySqlConnection(ConnectionString)) 
       { 
        if (Connection.State == ConnectionState.Open) 
        { 
         Console.WriteLine("Its open..>!!!!"); 
        } 

        Connection.Open(); 

        MySqlCommand cmd = new MySqlCommand(query, Connection); 
        cmd.ExecuteNonQuery(); 


        MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT LAST_INSERT_ID() AS 'identity'", Connection); 
        DataTable dt = new DataTable(); 
        adapter.Fill(dt); 
        uint ret = 0; 

        if (dt.Rows.Count > 0) 
        { 
         try 
         { 
          ret = Convert.ToUInt32(dt.Rows[0]["identity"]); 
         } 
         catch 
         { 
          ret = 0; 
         } 
        } 

        else 
         ret = 0; 

        Connection.Close(); 
        return ret; 
       } 
     } 

我連接字符串是

"server = 127.0.0.1; user id = ****; password = ****; database = testdb; pooling=true; maximumpoolsize=500;" 

和線程測試是

static void DoInserts(object o) 
{ 
    int i = (int)o; 
    Console.WriteLine("Insert Thread {0} launched", i); 


    for(int x = 0; x < 1000; x++) 
    { 
     uint insertId = DataLayer.uNonQuery(String.Format("INSERT INTO testdb.dbtest (writeNo,strNo) VALUES ({0},'x={0} thread={1}')", x, i)); 
    } 

    Console.WriteLine("Insert Thread {0} completed", i); 

} 

我得到的異常例外:連接必須有效且打開。大約6插入2個併發線程後,有什麼我需要做的啓用池正常工作?

感謝

+0

出於興趣,你爲什麼要檢查連接是否打開,然後打開它? –

+0

@DanielKelley嗨。我測試了在打開Open()之前它是否打開並且在Open()調用之前未打開,這是預期的,雖然啓用了連接池。 –

+0

''(Connection.State == ConnectionState.Open''表示你的代碼的邏輯有問題,如果你打開連接的範圍,不需要檢查它是否已經打開。 –

回答

1

在你行using (Connection = new MySqlConnection(ConnectionString))您正在使用的變量Connection。這個變量在哪裏定義?它是靜態的嗎?您應該在uNonQuery的範圍內定義它。如果變量Connection是靜態的,那麼在uNonQuery的新函數打開它之後,可能會關閉連接。

例如: - 線程1調用uNonQuery並打開,是否執行任何操作。 - 線程2調用uNonQuery,打開連接, - 線程1關閉Connection - 線程2無法完成任務,因爲連接突然關閉。

如果上述不是你的問題的原因,我會需要更多的代碼來檢查問題。

+0

嗨,看來Connection對象被定義爲靜態的,這導致了衝突,我只是在沒有靜態的情況下再次測試它,它完成了20個併發線程,每個線程有10 000個插入,非常感謝。 –