在使用Enterprise Library时,必须手动关闭数据库连接存在问题,因为GC在扫描堆时会查找超出范围的项目。
正在使用的池的一部分连接,但连接状态已中断或正在获取,但您已收到结果,将保持打开状态,并且池中的连接句柄将用完。
因此,添加手动连接检查和强制关闭连接是很好的形式。
现在,请使用SubSonic。使用EntLib库,我在finally块中执行以下操作:
public static bool GetISOCountryCodes(out DataSet dsISOCountryCodes, out Response dbResponse)
{
dbResponse = new Response();
dsISOCountryCodes = new DataSet();
StoredProcedure sp = null;
try
{
sp = SPs.GetISOCountryCodes(null);
dsISOCountryCodes = sp.GetDataSet();
// set the response object properties
dbResponse = new Response((int)sp.OutputValues[0]);
return dbResponse.IsValid;
}
catch (System.Exception ex)
{
return dbResponse.IsValid;
}
finally
{
if (sp.Command != null && sp.Command.ToDbCommand().Connection != null &&
sp.Command.ToDbCommand().Connection.State == ConnectionState.Open)
sp.Command.ToDbCommand().Connection.Close();
}
}
我知道有人说你不必手动这样做,因为SubSonic会为你做这件事,但是,我想知道是否有人遇到SubSonic没有关闭连接的问题(再一次,因为它在根目录使用EntLib,如果有更好的方法来实现这一点。
显然,在我的所有数据调用方法中,我将引用一个,例如“ConnectionCloser()”方法。
感谢。
答案 0 :(得分:0)
这篇文章更像是一个讨论通知。但是,我不确定问题是否已经用v5实际解决了。所以基本上答案是继续检查finally块。