2009-05-27 97 views
0

我注意到我們的一個內部應用程序正在使用DAAB,並且它似乎有某種連接泄漏。我以爲我記得讀書的地方,當你用下面的代碼:微軟企業DAAB和關閉連接

Database db = DatabaseFactory.CreateDatabase("ConnectionString"); 
IDataReader rdr = db.ExecuteReader("sproc") 

,連接被關閉了你,所以我調查,並沒有看起來是這樣。我對DAAB不太熟悉,有誰知道會發生什麼事以及何時?此外,相同的應用程序有像一堆類:

public class Example 
{ 
    private Database db; 
    public Example() 
    { 
     db = DatabaseFactory.CreateDabase("ConnectionString"); 
    } 

    public void Update(object o) 
    { 
     try 
     { 
     db.ExecuteNonQuery("sproc", o.parameter); 
     } 
     catch... 
     } 
     } 
    } 
} 

這起初似乎有點cringeworthy,但就像我說我不熟悉DAAB。如果DAAB中的連接沒有關閉,這些類會導致泄漏嗎?

回答

0

我正在使用Oracle數據庫上的DAAB調查泄漏 - 當使用Microsoft驅動程序時,一切似乎都正常,但在使用Oracle Odp.net提供程序時看到問題。 DAAB內部使用CommandBehavior枚舉來控制ExecuteReader方法的連接生命週期,但某些地方使用ExecNonQuery方法似乎並不正確。

1

您是否嘗試過處置數據讀取器?我總是這樣做,並沒有任何連接。

Database db = DatabaseFactory.CreateDatabase("ConnectionString"); 
using (IDataReader rdr = db.ExecuteReader("sproc")) { 
    // Use the data reader 
} 
1

有一個問題是來自entlib 3.0的ExecuteReader方法。這是爲實現事務處理作用域而做的修復,但是在處理大量數據時出現錯誤。所以他們已經做了一個修復,並且這個問題是由於修復造成的。所以當你使用ExecuteReader方法時,你必須關閉連接。如上所述,最好在使用塊內使用它