提前致谢!
答案 0 :(得分:12)
答案 1 :(得分:4)
为了提高Close()/ Dispose()的性能,请考虑在处理或关闭阅读器之前在关联的命令对象上调用Cancel(),尤其是当您没有到达记录集的末尾时。
例如:
using (var cmd = ... ))
{
using (var reader = (DbDataReader) cmd.ExecuteReader())
{
try
{
ConsumeData(reader); // may throw
}
catch(Exception)
{
cmd.Cancel();
throw;
}
}
}
答案 2 :(得分:2)
我的理解是,使用SqlDataSource
,会为您执行连接管理,您无需担心。
ObjectDataSource
首先不直接与数据库通信,因此只要底层对象正确执行其连接和读者管理,它就是安全的。
正如其他人所说,Close()
和using
是您与ObjectDataSource
一起使用的课程的朋友。
我的预感是,如果你有效地清理了代码库,你可能已经根除了这个问题。
答案 3 :(得分:2)
我们在生产环境中遇到了同样的问题。
解决了这个问题。问题首先是,我的代码中根本没有使用语句。 (这是几年前建立的,知识较少)。
然后我尝试将SqlDataSource放在using子句中。但这也无济于事。
这里的诀窍是,就像tvanfosson和Mischa所建议的那样,将读者置于一个使用条款中。这是实际关闭连接的对象。
在中等负载下,连接数量缩减到最小池大小为10。
答案 4 :(得分:0)
调用.Dispose()应该处理清理并释放任何保留的资源,但是.Close() method should be getting called as well when an object is done reading from the reader。
答案 5 :(得分:0)
我相信SqlDataSource会处理它自己的连接/阅读器问题,所以不用担心。至于你的手动连接,我发现这种模式过去很有用:
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlCommand command = connection.CreateCommand();
command.CommandText = ...
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
do
{
while (reader.Read())
{
... handle each row ...
}
} while (reader.NextResult());
}
}
catch (Exception ex)
{
... error handling ...
}
finally
{
if (connection != null && connection.State == ConnectionState.Open)
{
connection.Close();
}
}
}
答案 6 :(得分:-1)
我同意,对于ObjectDataSource,结束应该由其Select方法处理。我的ObjectDataSource Select方法返回一个SqlDataReader。我担心的是......在将SqlDataReader返回到UI后关闭时,它将变得无用。例如请参阅以下示例代码。我没有尝试过,也不想在这个开发阶段这样做。
SqlDataReader MySelectMethod(){
SqlDataReader dr = null;
try{
dr = DBObject.GetDataReader();
return dr;
}
finally{
dr.Close();
}
}
感谢到目前为止收到的所有意见!
...........
我的理解是 SqlDataSource,连接管理 是给你的,你有 无所畏惧。
ObjectDataSource不与之对话 数据库直接放在首位, 所以它会安全 - 只要 底层对象执行它 连接和读者管理 正确。
正如其他人所提到的,Close()和 使用是你的朋友的课程 你使用ObjectDataSource