我注意到我们的一个内部应用程序正在使用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...
}
}
}
}
这起初看起来有点畏缩,但就像我说我不熟悉DAAB。如果连接没有在DAAB中关闭,这些类是否会导致泄漏?
答案 0 :(得分:1)
您是否尝试过处理数据读取器?我总是这样做,并没有任何挥之不去的联系。
Database db = DatabaseFactory.CreateDatabase("ConnectionString");
using (IDataReader rdr = db.ExecuteReader("sproc")) {
// Use the data reader
}
答案 1 :(得分:1)
有一个问题是来自entlib 3.0的ExecuteReader方法。这是实现事务处理范围的修复,但在处理大量数据与事务时出错。所以他们已经做了一个修复,这个问题导致了这个问题。因此,当您使用ExecuteReader方法时,您必须关闭连接。最好在上面提到的使用块中使用它
答案 2 :(得分:0)
我正在使用Oracle数据库上的DAAB调查泄漏 - 使用Microsoft驱动程序时一切似乎都很好但我在使用Oracle Odp.net提供程序时遇到了问题。 在内部,DAAB使用CommandBehavior枚举来控制ExecuteReader方法的连接生存期,但是使用ExecNonQuery方法的某些东西似乎不对。