Sql server 如果将datareader放入using块中,SQL连接是否不会关闭?
因此,我最近继承了一个使用以下数据访问模式的大型项目;不幸的是,这导致了大量与连接池相关的超时异常 超时已过期。获取数据之前经过的超时时间 来自池的连接。发生这种情况的原因可能是所有的 连接正在使用,已达到最大池大小“ 很明显,接头正在泄漏,未正确关闭。 因此,框架有一个Sql server 如果将datareader放入using块中,SQL连接是否不会关闭?,sql-server,ado.net,connection-pooling,datareader,connection-timeout,Sql Server,Ado.net,Connection Pooling,Datareader,Connection Timeout,因此,我最近继承了一个使用以下数据访问模式的大型项目;不幸的是,这导致了大量与连接池相关的超时异常 超时已过期。获取数据之前经过的超时时间 来自池的连接。发生这种情况的原因可能是所有的 连接正在使用,已达到最大池大小“ 很明显,接头正在泄漏,未正确关闭。 因此,框架有一个DataAccess类,方法是GetDataReader 当引用数据读取器时,它被放置在using块中,但连接仍在泄漏 连接未显式关闭或未放置在使用块中这一事实是否是连接泄漏的原因 通常,我会将连接包装在using块中,并将数据
DataAccess
类,方法是GetDataReader
当引用数据读取器时,它被放置在using块中,但连接仍在泄漏
连接未显式关闭或未放置在使用块中这一事实是否是连接泄漏的原因
通常,我会将连接包装在using块中,并将数据读取器包装在using块中
显然,这个框架有很多缺陷,但是在数据读取器中使用选项CommandBehavior.CloseConnection
会解决这个问题吗
无外部代码直接访问SqlConnection
,并且必须通过这个DataAccess
类
public IDataReader GetDataReader(QueryDto dto)
{
DateTime current = DateTime.Now;
Database db = DatabaseFactory.CreateDatabase(dto.DatabaseName);
DbCommand cmd = db.GetStoredProcCommand(dto.StoredProcedureName);
if (dto.Params.Length > 0)
{
cmd = db.GetStoredProcCommand(dto.StoredProcedureName, dto.Params);
}
dto.Command = cmd;
cmd.CommandTimeout = dto.Timeout;
cmd.Connection = db.CreateConnection();
try
{
cmd.Connection.Open();
}
catch (SqlException ex)
{
// Handle Exception here...
throw;
}
return rdr;
}
在某些静态存储库类中的用法:
var query = new QueryDto
{
DatabaseName = "SomeDatabase",
Params = parms,
StoredProcedureName = "StoredProcedureName"
};
using (IDataReader dr = dataAccess.GetDataReader(query))
{
while (dr.Read())
{
// do stuff here
}
}
我认为您的问题在于using语句围绕着一个嵌入了开放资源的函数。using不会处理在
GetDataReader
中打开的连接。我认为您的观点是正确的,即连接本身需要在using块中。仅对传入的对象调用dispose,没有t任何嵌套资源。可能的重复事实上,我的问题不是将using stmt放在数据读取器上是否可以正确处置/关闭。问题是当连接未包装在using块中时,基础SQL连接是否会关闭