2010-09-02 79 views
2

我有BasePage.cs類正在被其他.cs文件使用,而不是System.Web.UI.Page(公共部分類頁面:BasePage)。使用BasePage打開和關閉SQL連接有多安全?

我正在使用它來打開和關閉SQL連接,以確保每個SQL連接都關閉。

代碼看起來像這樣

{ 
    public class BasePage: System.Web.UI.Page 
    { 
     public SqlConnection globalConnection; 

     protected override void OnInit(EventArgs e) 
     { 
      globalConnection = new SqlConnection(); 
      globalConnection.ConnectionString = ConfigurationManager.ConnectionStrings["kontemiConnectionString"].ToString(); 
      globalConnection.Open(); 
     } 

     protected override void OnUnload(EventArgs e) 
     { 
      if (globalConnection != null) 
      { 
       globalConnection.Close(); 
      } 
     } 
    } 
} 

到目前爲止,它一直對我很好。這意味着每次連接打開時它也會關閉。或者至少我是這麼想的。

我的問題是這個解決方案是否是防彈的,並且在代碼執行過程中出現一些處理錯誤的情況下,每個連接都會關閉。在追蹤這段代碼時,如果我故意創建錯誤500,它總是進入OnUnload事件並關閉。

那麼,你認爲這個執行安全嗎? (要停止討論是否我不應該打開SQL當我真正需要的時候,答案是,它使用BasePage的每一頁也打開SQL連接。)

回答

1

我可能是錯的,但我的猜測是,如果頁面生命週期通過OnUnload之前的異常結束,則連接不會關閉。至少你可以做的,以防止這種情況是確保你在全球'最後機會'級別捕捉所有例外,並關閉在那裏的連接。我仍然認爲在本地使用連接,理想情況下使用using塊,是更好的解決方案,因爲它不會讓連接保持更長的時間,並且您不必擔心關閉它們(using的語義會執行爲你工作)。

+0

全球有必要嗎?你不能只用頁面的錯誤事件嗎? – 2010-09-02 16:33:36

+0

我可以保留代碼的其餘部分嗎?這意味着我將全局定義SqlObject和ConnectionString?然後,只需撥打塊?或者我應該把連接字符串放入Global.asax,因爲它總是相同的,並且不需要使用everypage加載? – feronovak 2010-09-02 17:04:13

+0

@Jace Rhea:你可以,但全球更安全。我一直在頁面的OnError沒有觸發的情況下,但全局錯誤處理程序發現異常。 @feronovak:當然不是。 「使用」塊用於創建,然後使用並最終處理實現「IDisposable」的對象。如果你不這樣使用它,根本沒有意義使用它。 – tdammers 2010-09-02 17:39:04

2

打開和關閉您正在使用它們的SQL連接是更好的做法。在這種情況下,CLR管理連接池 - 重用連接並在合適時關閉連接。使用相同的連接字符串進行大量的打開和關閉連接並不會增加您想象的那樣多的開銷。