2008-12-05 200 views
3

如何在ASP.Net應用程序中管理數據庫連接?連接管理ASP.net

我的理解告訴我,「最好的」方法是打開連接,進行查詢,關閉連接,並多次執行此操作,因爲連接池使成本變得可忽略不計。

問題來了,當我有一個DAL,其中每個方法看起來自己的連接。例如。

 
User x = DAL.GetUserDetails(); 
Customer y = DAL.GetCustomer(); 

這是罰款,直到我們開始談論的TransactionScope

 
using (TransactionScope t.... 
{ 
DAL.UpdateCustomer(y); 
DAL.UpdateUser(x); 
t.Complete(); 
} 

ASP.Net想現在使用DTC,因爲(我猜)有涉及多個連接。

有人會說「緩存連接somwhere」,但我需要顯式銷燬連接,因爲我管理安全的方式(作爲/恢復),我不想打電話每一頁都這樣做,因爲有人會忘記打電話。我也可以將連接傳遞給每個方法,但這並不理想,因爲頁面必須管理連接。

我有意義還是錯過了一些基本的東西?

回答

1

我正在讀某處,我不記得微軟將在哪裏解決這個問題,當你有兩個連接到相同的數據庫,他們不會升級到DTC,這將導致此問題消失。

在那之前我們所做的是開發我們的TransactionScope,我們的DAL然後會要求TS建立一個新的連接,當我們放置TS時它會關閉連接。

連接存儲在LogicalCallContext中,但我會考慮使用HTTP Context。我在應用程序上線之前離開了公司,但從我聽說他們沒有遇到任何問題。

所以你必須

using (CustomTS.New()) 
{ 
CustomerDal.Update() 
userDal.Update() 
} 

CustomTS不得不將獲得當前的事務和連接的靜態方法。

+0

好主意,所以如果我理解正確:在dal方法中,我可以看看TransactionScope.Current。如果它不爲null,則使用該事務以及與該事務相關的連接。如果它爲空創建一個連接,因爲我目前做? – 2008-12-05 01:28:25

+0

我必須先給它一個去,然後我給它一個大的勾號 – 2008-12-05 01:30:26

0

在TransactionContext的工作原理上採用類似的思路實現它。

我開始寫如何做到這一點,但我覺得一個例子使它更清晰:

public class MyConnectionManager : IDisposable 
{ 
    [ThreadStatic] // static per thread 
    private static SqlConnection con; 

    public static SqlConnection Connection 
    { 
     get 
     { 
      if (con == null) 
      { 
       con = new SqlConnection(); 
       con.Open(); 
      } 
      return con; 
     } 
    } 

    public void Dispose() 
    { 
     if (con != null) 
     { 
      con.Close(); 
     } 
    } 
} 

public class Program 
{ 
    public void Run() 
    { 
     using(new MyConnectionManager()) 
     { 
      MakeCall(); 
      MakeCall(); 
     } // Disposal happens here 
    } 

    public void MakeCall() 
    { 
     // The property can be accessed from anywhere 
     SqlCommand cmd = new SqlCommand("SELECT 1", MyConnectionManager.Connection); 
    } 
} 

這將導致使用聲明範圍內的任何呼叫使用相同的連接,只要他們全部在同一個線程上運行。你也可以在那裏拋出一個事務上下文。

注意:在ASP.NET WebPages場景中,線程可以在連接和page_load之間切換。 See this article for more info。線程也被重新使用。但是,如果您正在開發在應用程序之間共享的DAL,則可能無法使用HttpContext,因爲沒有。