实现的数据库访问类IDbConnection
, IDbCommand
and IDataReader
全部实施IDisposable
,但显然 Command 和 Reader 依赖于 Connection。我的问题是,我是否必须单独对每个对象进行 Dispose(),还是在处理 Connection 对象时也会处理其他对象?
也就是说,我可以这样做并保证我不会冒任何未释放的非托管资源的风险:
using (IDbConnection conn = GetConnection())
{
IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = " ..... ";
IDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
}
}
或者我必须这样做:
using (IDbConnection conn = GetConnection())
{
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = " ..... ";
using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
}
}
}
}
或者这种实现依赖于实现,因此它可能可以使用一个数据库的提供程序来工作,但不能用于另一个数据库的提供程序?
最好的策略是在使用块时使用所有 ADO.NET 对象 - 句号。
对各种 ADO.NET 对象进行一点反射表明,如果不关闭/处理,东西或多或少会掉落在地板上。其效果很大程度上取决于您使用的提供程序 - 如果您使用的是非托管句柄(ODBC、OleDb 等),您可能会泄漏内存,因为我没有看到任何内容以终结器的方式。如果它是一个全托管提供程序(例如,SqlClient),它最终会被清理,但根据您所持有的对象,您最终可能会在数据库服务器上保留使用的资源比您想要的时间长得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)