gpt4 book ai didi

.net-3.5 - 为什么仍要调用SqlClient.SqlDataReader Close()方法?

转载 作者:行者123 更新时间:2023-12-03 13:04:07 24 4
gpt4 key购买 nike

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

请帮助我了解什么是最佳实践。

我已经看到一个相关的问题here,它进一步说明了我在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

最佳答案

当然,如果超出范围(如果他们没有其他引用),它将被收集。收集到它后,将通过其Dispose()方法关闭它。但是,您永远不会真正知道GC何时要取消分配。如果不关闭读者,则很快就会耗尽与数据库的可用连接。

进一步阅读


奥莱利的ADO.NET Connection Pool Explained
Microsoft的Retrieving Data using a DataReader具有DataReaders的一般概述。


〜威廉·赖利·兰

关于.net-3.5 - 为什么仍要调用SqlClient.SqlDataReader Close()方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/250468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com