当前位置: 代码迷 >> C# >> DataReader用完后是该Close仍是Dispose
  详细解决方案

DataReader用完后是该Close仍是Dispose

热度:106   发布时间:2016-05-05 03:55:40.0
DataReader用完后是该Close还是Dispose
要频繁读数据库,多次调用
OracleCommand Cmd = new OracleCommand();
...
OracleDataReader OraOdr = Cmd .ExecuteReader();

finally
{}
里要OraOdr.Close(),还需要Dispose?
Cmd 也得释放?
顺序怎么排

好像占用内存越来越多,不知道是这里的原因还是其他原因
------解决思路----------------------
using(IDataReader)
{
}

------解决思路----------------------
从内往外一层层关
------解决思路----------------------
close  之后再 释放。
------解决思路----------------------
先释放DataReader,再释放Command,Close不能保证释放,必须要调用Dispose,也可以不调用Close,直接Dispose
------解决思路----------------------
OracleCommand 有 close 方法吗?
至少在 MSDN 中没有看到,仅有
Dispose  已重载。 释放由 Component 占用的资源。 (从 Component 继承。)

或者其某一辈父类由此方法,但肯定是无此功能的
------解决思路----------------------
要确保你的 DbConnection 尽快执行 Close,例如把它放到 using(){...} 结构中。

而对于 DbDataReader,既不需要Close也不需要Dispose。因为GC会在分析到系统最必要的时候才随后(很快)调用这两个东西,用不着你的代码来调用它。

实际上过早调用 Dispose 是个坏习惯。只有在你知道确实应该调用时才调用,比如说对于连接池中德DbConnection必须尽早调用它。不要过早调用(应该让GC去自动调用)。
------解决思路----------------------
引用:
好像占用内存越来越多,不知道是这里的原因还是其他原因


这个你要具体分析到底占用多少内存。看你只是在这么一个代码上来考虑“内存占用越来越多”,我猜你的程序比较小。

其实你写的pc端的小程序占用内存没有200M不能算是“占用内存很多”。你看手机上的微信(其实已经拆成了许多程序)的核心程序就占用110M以上手机内存,也没有几个手机用户骂它。
------解决思路----------------------
打开你的手机微信看看其一个核心UI的内存占用,你经常看到其超过100M许多。

以前飞信出来时,有一大帮人骂飞信占用内存20M多,骂它“不用c++写而用c#写”。

其实飞信的问题在于产品研发、对互联网公司对移动公司的冲击能力的大方向判断出了巨大的偏差,飞信明明有能力做许多扩展,却为了保证中移动的自己家的那一点自留地而不愿意搞合作社。跟占用内存没有关系,跟c++也没有多大关系。
------解决思路----------------------
引用:
要频繁读数据库,多次调用
OracleCommand Cmd = new OracleCommand();
...
OracleDataReader OraOdr = Cmd .ExecuteReader();

finally
{}
里要OraOdr.Close(),还需要Dispose?
Cmd 也得释放?
顺序怎么排

好像占用内存越来越多,不知道是这里的原因还是其他原因

OracleDataReader用完一定要close,进行close后,GC在适当的时间就会自动回收。
你可以测试一下,密集的打开OracleDataReader不关闭,若干个客户端同时工作,会导致数据库连不上。

using(OracleCommand Cmd = new OracleCommand())
{
using(OracleDataReader OraOdr = Cmd .ExecuteReader())
{}
}


------解决思路----------------------
引用:
要确保你的 DbConnection 尽快执行 Close,例如把它放到 using(){...} 结构中。

而对于 DbDataReader,既不需要Close也不需要Dispose。因为GC会在分析到系统最必要的时候才随后(很快)调用这两个东西,用不着你的代码来调用它。

实际上过早调用 Dispose 是个坏习惯。只有在你知道确实应该调用时才调用,比如说对于连接池中德DbConnection必须尽早调用它。不要过早调用(应该让GC去自动调用)。

顶顶顶!!!!!!!!!!!!!!!
------解决思路----------------------
内存释放也是需要时间的
------解决思路----------------------
自己的事情,只有自己最清楚!
------解决思路----------------------
引用:
using(IDataReader)
{
}

IDataReader必须显示关闭,Using不能确保非托管资源的销毁。
------解决思路----------------------
用完写Close就行了,Close成功之后会自动调用Dispose方法。
  相关解决方案