当前位置:  开发笔记 > 数据库 > 正文

为什么还要调用SqlClient.SqlDataReader Close()方法?

如何解决《为什么还要调用SqlClient.SqlDataReaderClose()方法?》经验,为你挑选了3个好方法。

SqlClient.SqlDataReader是否是.NET托管对象?为什么我们必须调用Close()方法显式关闭一个打开的连接?不应该超出这个对象的范围自动关闭这个?垃圾收集器不应该清理干净吗?

请帮助我了解这里的最佳做法.

我在这里看到了一个相关的问题,它进一步说明了我对Web应用程序的问题.问题是我们的连接不畅.详细错误在这里:

Exception: System.InvalidOperationException
Message: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Source: System.Data 

at  System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean& isInTransaction)
at  System.Data.SqlClient.SqlConnection.Open()

要解决这个问题,我必须显式关闭所有SQLDataReader对象.

我正在使用.NET Framework 3.5



1> wprl..:

当然,它会在超出范围时被收集(如果它们没有其它参考).收集它时,它将通过Dispose()方法关闭.但是,你真的不知道GC什么时候会解除分配; 如果不关闭读者,则很快就会耗尽与数据库的可用连接.

进一步阅读

O'Reilly的ADO.NET连接池解释

Microsoft 使用DataReader检索数据概述了DataReader.

~William Riley-Land



2> FlySwat..:

@Lieutenant Frost

作为我们商店的一项规则,我们在Try ... Finally块中显式地包装所有数据库调用,最后一部分捕获和关闭数据连接.值得花费一点努力来为自己节省一个重大的故障排除问题.

我有一个类似的规则,但我要求实现IDisposable的对象使用'using'块.

using (SqlConnection conn = new SqlConnection(conStr))
{
     using (SqlCommand command = new SqlCommand())
     {
        // ETC
     } 
}

即使有异常,using块在离开作用域时立即调用Dispose.



3> Jeffrey Harr..:

一个好的做法(只要您不重用连接)是将命令行为添加到SqlDataReader以在处理时关闭连接:

SqlDataReader rdr = cmd.ExecuteReader( CommandBehavior.CloseConnection );

添加此选项将确保在关闭(或垃圾回收)SqlDataReader对象时关闭与数据库的连接.

但是,正如我之前所说,如果您计划在同一方法中重新使用数据库连接进行其他操作,则不希望这样做.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有