2012-05-20 28 views
3

爲C#一個典型的例子連接/ MySQL的相互作用涉及這樣的代碼(我跳過嘗試/捕獲和錯誤檢查爲簡單起見):正確使用與C#和MySQL

conn = new MySqlConnection(cs); 
conn.Open(); 
string stm = "SELECT * FROM Authors"; 
MySqlCommand cmd = new MySqlCommand(stm, conn); 
rdr = cmd.ExecuteReader(); 

的方案是一種用於獨立應用程序和WCF Web服務的類庫。那麼,我應該在查詢時打開連接嗎?或者當我打開該程序時應該打開它嗎?

+3

首先,您不應該忘記關閉連接(甚至更好地在使用語句中包裝連接)。連接是非託管資源,直到他們明確關閉爲止。連接永遠不會再開放,因此在應用程序的整個生命週期中使用單個連接是一個非常糟糕的主意。 – Jay

+0

是的,我知道最後的問題。因此,我必須做的是,在單個查詢或後續查詢組中進行一致的「操作」/「操作」(例如,帶有一些INSERT的循環)中的所有數據庫活動並在打開之前打開並關閉這些操作後的連接? – Cranio

回答

3

您通常需要根據unit of work打開一個連接。 MySQL ADO.NET驅動程序可以爲您建立連接,但是,我建議不要讓每個查詢都打開一個連接。可能發生的情況是,您開始使用幾種方法來爲一個業務事務提供服務,並且由於每個方法都打開一個連接,所以最終可能會導致一個業務事務處理不足,導致您的可用連接中斷。當然,這可能導致超時,性能較差等

相反,考慮定義創建和打開一個連接和交易,並有自己的數據訪問層請求當前IUnitOfWork,這將提供一個IUnitOfWork/UnitOfWork API當前連接和事務。

當然,訣竅在於知道工作單元何時開始以及何時結束。他們與完整,有意義的行動相關聯(「商業交易」)。例如,當您正在爲您的某個WCF服務的方法提供服務時。當服務實例啓動時,爲了響應請求,應該創建一個工作單元。然後,DAL組件可以請求當前的工作單元並使用它。然後當請求完成時,應該提交工作單元(它應該提交事務並關閉連接)。

4

要擴大HackedByChinese的建議,請考慮以下事項。你有一個主要的協調方法來處理創建連接,打開它,設置事務,然後調用執行不同類型工作(查詢)的worker方法。

public static void UpdateMyObject(string connection, object myobject) 
     { 
     try 
     { 
      using (SqlConnection con = new SqlConnection(connection)) 
      { 
       con.Open(); 
       using (SqlTransaction trans = con.BeginTransaction()) 
       { 
        WorkingMethod1(con, myobject); 
        WorkingMethod2(con, myobject); 
        WorkingMethod3(con, myobject); 
        trans.Commit(); 
       } 
       con.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("SOMETHING BAD HAPPENED!!!!!!! {0}", ex.Message); 
     } 
    } 

    private static void WorkingMethod1(SqlConnection con, object myobject) 
    { 
     // Do something here against the database 
    } 

    private static void WorkingMethod2(SqlConnection con, object myobject) 
    { 
     // Do something here against the database 
    } 

    private static void WorkingMethod3(SqlConnection con, object myobject) 
    { 
     // Do something here against the database 
    }