一个简单的数据库查询问题

sunxuehui 2008-11-13 09:17:25
在服务里定期执行下边的代码,结果内存一直在涨,时间长了内存十分庞大.奇怪了,还有什么内存没释放吗,代码也很简单啊!

CoInitialize(NULL);
_ConnectionPtr m_pConnection;

m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Provider=OraOLEDB.Oracle.1;User ID=scheduler;Password=scheduler;Data Source=151;", "", "", adModeUnknown );


_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
for (int i=0;i<10;i++)
{
m_pRecordset->Open("select * from rules", m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);

if(m_pRecordset!=NULL)
{
if (m_pRecordset->State) m_pRecordset->Close();

}
}

if(m_pConnection!=NULL)
{
if(m_pConnection->State) m_pConnection->Close();

}
CoUninitialize();
...全文
112 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
huis 2008-11-14
  • 打赏
  • 举报
回复
循环打开表的话把所有的对象都创建在循环里,这样每次都创建和释放,看看行不行.
sunxuehui 2008-11-13
  • 打赏
  • 举报
回复
谢谢楼上几位,Release和NULL我都试过了,效果一样的.
不过我在控制台程序里定期循环执行的时候,内存过一段时间能降下来.
但写在服务里就是升的多,降的少,很是郁闷!
srxumin 2008-11-13
  • 打赏
  • 举报
回复
楼上的高手说:ADO是存在内存泄漏的现象

关注下,这个问题太严重了,以前还不知道,有什么方法避免吗?要不然用ADO的内存不是几下就崩了?
scq2099yt 2008-11-13
  • 打赏
  • 举报
回复
资源的使用和释放成对出现。
dulei115 2008-11-13
  • 打赏
  • 举报
回复
m_pConnection.Release();
shakaqrj 2008-11-13
  • 打赏
  • 举报
回复
m_pRecordset.Release();m_pConnection.Release();
或者直接赋值NULL
见习学术士 2008-11-13
  • 打赏
  • 举报
回复
加上个容错看看。。
不过问题好像不在这里呀。
内存泄漏 2008-11-13
  • 打赏
  • 举报
回复
ADO是存在内存泄漏的现象,另外,你代码的最后CoUninitialize之前还应该加上:

m_pRecordset = NULL;
m_pConnection = NULL;
sunxuehui 2008-11-13
  • 打赏
  • 举报
回复
完整代码
       CoInitialize(NULL);
int iPeriod=60*1000;

// 创建定时器并启动定时器
LARGE_INTEGER liStartTime;
liStartTime.QuadPart=-10*10000000;

HANDLE m_hTime=CreateWaitableTimer(NULL,FALSE,NULL);
SetWaitableTimer(m_hTime,&liStartTime,iPeriod,NULL,NULL,FALSE);

int i=0;

MSG msg;
while(!PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))
{

if(WaitForSingleObject(m_hTime,iPeriod) == WAIT_OBJECT_0)
{
/*setchar();
bbb();
ccc();*/
//if (i<30)
{
aaa();
}
i++;
}
}
CoUninitialize();

void aaa()
{

_ConnectionPtr m_pConnection;

m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Provider=OraOLEDB.Oracle.1;User ID=scheduler;Password=scheduler;Data Source=151;", "", "", adModeUnknown );


_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
//for (int i=0;i<10;i++)
{
m_pRecordset->Open("select * from rules", m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);

if(m_pRecordset!=NULL)
{
if (m_pRecordset->State)
m_pRecordset->Close();
m_pRecordset.Release();
m_pRecordset=NULL;
}
}

if(m_pConnection!=NULL)
{
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection.Release();
m_pConnection=NULL;
}

}
版本:presto-server-0.214.tar软件版本 presto-cli-0.214-executableCentOS71、presto的起因 hadoop ---hdfs----MR(java)-----hivehive底层原理用MR,速度比较慢,公司hadoop集群主要集中于晚上到凌晨,平日工作时间负载不是很高。但在工作时间内,公司业务人员有实时查询的需求,现在主要借助于hive提供业务人员的查询。hive是基于MR类的SQL查询工具,他会输入的查询SQL解析为MapReduce,能极大的降低使用大数据门槛,让一般的业务人员可以直接准对大数据进行查询,但是有一个利弊,它的查询基于MR,会让人等待比较着急,等待的时间可能是几个小时或者一天。 spark基于内存提高改良的hive,sql,现在factbook在hive上面开发一套利器,准对hive可以通过sql语句快速查询,presto。2、Facebook为何开发Presto  Facebook的2011的数据仓库存储在少量大型hadoopfs集群,Hive是FaceBook在几年前专门为Hadoop打造的一款数据仓库工具,在以前,facebook的科学家和分析师一直靠hive进行数据分析.但hive使用MR作为底层计算框架,是专为批处理设计的,但是随着数据的不断增多,使用hive进行一个简单的数据查询可能要花费分钟或者几个小时,显然不能满足查询需求,FaceBooke也调研了其他比hive更快的工具,但是他们需要在功能有限的条件下做简单操作,以至于无法操作Facebook庞大的数据要求。2012年开始研究自己的框架--presto,每日可以超过1pb查询,而且速度比较快,faceBook声称Presto的性能比hive要好上10倍或者100倍,presto和hive都是facebook开发的 Presto是一个开源的分布式SQL查询引擎,适用于交互式查询,数据量支持GB到PB字节。Presto的设计和编写完全是为了解决Facebook这样规模的商业数据仓库交互式分析和处理速度的问题Presto可以做什么 Presto支持在线数据查询,包括Hive kafka Cassandra关系数据库以及专门数据存储,一条Presto查询可以将多个数据源进行合并,可以跨越整个组织进行分析。Presto以分析师的需求作为目标,他们期望相应速度小于1秒到几分钟,Presto要么在使用速度的快的昂贵的商业方案,提高内存,要么是消耗大量的硬件进行快速查询。(128G 64G)本套课程教给如何在企业环境中使用Presto技术。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧