2011-03-26 49 views
1

使用C#,Visual Studio 2008中,SQL Server 2000中(至2008年)SQL連接的性能問題

我用我的SQL調用一個數據層類在我的Web應用程序:

在數據層都是SQL調用該應用程序,並且所有SQL活動都發生在該類中。

例如:

protected void UpdatePeople(int iPeopleID, string Lastname......) 
{ 
    InitCmd("sUpdatePeople"); 
    c_objSQLCmd.Parameters.Add(new SqlParameter("@PeopleID", iPeopleID)); 
    c_objSQLCmd.Parameters.Add(new SqlParameter("@LastName", szLastName)); 
    CmdExecuteNonQuery(); 
} 

然後,我有做SQL工作輔助對象:

private void InitCmdSP(string szStoredProc) 
    { 
     c_objSQLCmd.Parameters.Clear(); 
     c_objSQLCmd.CommandType = CommandType.StoredProcedure; 
     c_objSQLCmd.CommandText = szStoredProc; 
    } 
    private int CmdExecuteNonQuery() 
    { 
     int iReturn = 0; 
     if (c_objSQLConn.State != ConnectionState.Open) 
      c_objSQLConn.Open(); 
     iReturn = c_objSQLCmd.ExecuteNonQuery(); 
     c_objSQLConn.Close(); 
     return iReturn; 
    } 

我也有幫手obects返回數據表或數據集和的ExecuteScalar和返回INT,字符串等等。

我的問題是,我打開/關閉SQL連接每次都會帶來什麼性能?

到目前爲止,應用程序通常少於600-700個用戶,並且其中很少用戶同時使用,因此對用戶的感知性能可能不是一個回頭問題。我只是想考慮最佳做法。

感謝, 約翰

+0

另一方面,我將通過使用「使用語句」 - http://www.w3enterprises.com/articles/using.aspx推出所有連接邏輯,以確保在出現任何異常時處理連接發生 – WorldIsRound 2011-03-26 14:17:42

回答

0

您可以連接池,基於擊中你的web應用程序的請求數量設置minimum PoolSize考慮。另外,您可以考慮將使用語句中的所有連接邏輯包裝在一起,以確保清理所有連接。 如:

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     connection.Open();  
    } 

這裏是一個article讓你開始在連接池。既然你有一個網絡應用程序,你也可以考慮Unit of work pattern

1

關閉連接每一次可能會對性能幾乎沒有影響。

Sql Server ADO.NET提供程序將自動爲您的應用程序使用連接池(除非您明確告訴它不)。

但對於使用任何實現IDisposable(包括SqlConnectionSqlCommand)的最佳實踐是包裹項目在using塊,像這樣:

using(var connection = new SqlConnection(...)) 
{ 
    using(var command = connection.CreateCommand()) 
    { 
     // Do something with the command. 
    } 
} 

這確保了任何非託管資源的最早發佈機會,並且重要的是抵制特殊的代碼路徑。上面的代碼是語法糖:

SqlConnection connection; 

try 
{ 
    connection = new SqlConnection(...); 

    SqlCommand command; 

    try 
    { 
     command = connection.CreateCommand(); 

     // Do something with the command. 
    } 
    finally 
    { 
     if(command != null) 
     { 
      command.Dispose(); 
     } 
    } 
} 
finally 
{ 
    if(connection != null) 
    { 
     connection.Dispose(); 
    } 
} 

所以基本上,using是真棒。

+0

@Xcaliburp感謝您的使用建議;然而,我不知道我將如何使用我使用的幫助器對象來實現。我如何將現有的命令對象(c_objSQLCmd)與你的提示中的「command = connection.CreateCommand()」聯繫起來?謝謝,約翰。 – John 2011-03-26 15:48:00

+0

經過進一步的思考,我假設我可以使用using語句中的現有對象。 I.E.使用(c_objSQLcmd),正確嗎? – John 2011-03-26 16:12:03

+0

@John - 不,你不能在using語句中重用一個對象。 using語句將調用dispose,並且在對象的生命週期中只能發生一次。我不確定從多個方法共享一個命令對象獲得的好處。每次需要時,我都會創建並處理一個新的。或者我將它作爲參數傳遞(依賴注入) - 在這種情況下,調用堆棧中的using會更高。 – sheikhjabootie 2011-03-26 23:59:50