2009-08-23 35 views
2

我想知道從ASP.NET Web服務調用靜態方法是否存在任何缺陷。從ASMX調用靜態方法的缺陷

internal static object SelectScalar(String commandText, DataBaseEnum dataBase) 
    { 
     SqlConnection sqlc = new SqlConnection(AuthDbConnection.GetDatabaseConnectionString()); 
     object returnval=null; 
     if (sqlc!=null) 
     { 
      SqlCommand sqlcmd = sqlc.CreateCommand(); 
      sqlcmd.CommandText = commandText; 
      sqlc.Open(); 
      returnval = sqlcmd.ExecuteScalar(); 
     } 
     return returnval; 
    } 

因此,對於上述方法的示例;在多種Web方法和多個客戶端同時調用此方法(例如,調用一個調用此函數的Web方法的1000個調用)時是否存在任何缺陷?

回答

3

既然你創建一個新的SqlConnection,你要處理它,否則連接將不會關閉。有關使用指南,請參閱MSDN

,它的靜態方法,但...這似乎並不成爲一個問題,因爲你沒有任何更新共享狀態(全局變量)的事實。

編輯:AFAIK,中web服務的靜態方法「陷阱」是相同的任何其他應用。唯一需要注意的是web服務是一個預計長時間可靠運行的服務器。因此,隨着時間的推移可能導致問題的東西(內存泄漏,數據庫連接耗盡等)比其他運行時間更短的應用程序更重要。

+0

是啊......除了線程安全之外,我應該看看代碼的其他方面。爲你+1。 – 2009-08-23 18:48:18

+0

我剛剛編輯了這個小片段。我們確實關閉了連接。 – choudeshell 2009-08-23 18:51:15

3

需要注意的一點是靜態成員更改應用程序域中其他線程可訪問的狀態。在這些情況下,你必須採取適當的措施使其順利進行。

你的方法不會觸及任何狀態(一切都是本地的),所以你沒問題。


正如duffymo和納德指出,你應該處理您的連接,你應該dipose實現IDisposable的任何物體。

3

我不知道C#是像Java,但打開SQL連接和失敗離開方法之前關閉它似乎並不像我是個好主意。一旦超出範圍,GC將清理它,但這與用Java關閉連接不同。

Java中的習語會要求您關閉finally塊中的連接。除非你確定C#類不需要這樣的事情,否則我會研究它。

您很快就會發現 - 數千次網絡呼叫會耗盡快速連接的數量,如果它們很少。

還有一件事要檢查:以這種方式打開連接在Java中是昂貴的,所以它們通常是合併的。連接池是否也在C#中完成?繼續打開和關閉數據庫連接效率低下嗎?你能用靜態的共享連接完成同樣的事情嗎?如果你這樣做,線程問題可能會發揮作用。

+0

你正在寫關於在連接上調用dispose的需求。爲你+1。 – 2009-08-23 18:39:42

+0

@duffymo:是的,可以使用游泳池。請參閱http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx – 2009-08-23 18:43:27

+0

對不起,我剛剛複製該小片段並編輯它。是的 - 我們確實關閉了連接,並使用連接池。我只是想知道是否有任何陷阱 - 不確定哪種類型或種類的陷阱。我們在很多地方使用這種類型的範例。 – choudeshell 2009-08-23 18:50:28