int CMyDataBase::DBManagerCheckNamePass(char *phone, char *pass, char *mac)
{
char parament[256];
_RecordsetPtr pRs = NULL;
_variant_t paramval;
int nRet = 0; sprintf(parament, "select * from office t1, printer t2 where t2.printer_vip = '%s' and t1.office_manager = '%s' "
" and t1.office_password = '%s' and t1.office_id = t2.office_id",mac, phone, pass); 
try 
{
pRs = m_Con->Execute(parament, NULL, adCmdText); if (pRs == NULL )
{
return -1;
} if( !( pRs->ADOEOF && pRs->BOF ))
{
nRet = 1;
}
}
catch (_com_error) 
{
return 0;
} pRs->Close();
pRs.Release();
pRs = NULL; return nRet;
}代码如上:
在程序执行过程中没有catch到任何_com_error,即全部按正常流程运行。该函数执行50次之后,本身内存占用增长200K左右。更重要的是,它导致Oracle.exe进程内存增和200多K。
Oracle只开了两个服务,一个Listener,一个数据库Service,版本为8i。
不知何解?有什么方法可以解决?

解决方案 »

  1.   

    感觉是com的问题。高手过来看看啊。
      

  2.   

    不只是Oracle
    其它的数据库我也碰到过.
      

  3.   

    是不是没描述清楚?
    一个多线程程序,使用ado连接数据库。
    在主线程中有一个自己写的数据库类,在该类中使用_ConnectionPtr连接oracle。
    在工作线程中,使用一个该类的变量(全局共享的)访问数据库。本程序本身无内存泄漏。但每执行一次select,oracle.exe进程的内存就增加4K-12K不等,而且一直不回落。
    不知何故,请高手帮忙。关键代码如下:
    try 
    {
    pRs = m_Con->Execute(parament, NULL, adCmdText);if (pRs == NULL )
    {
    return -1;
    }if( !( pRs->ADOEOF && pRs->BOF ))
    {
    nRet = 1;
    }
    }
    catch (_com_error) 
    {
    return 0;
    }pRs->Close();
    pRs.Release();
    pRs = NULL;
      

  4.   

    看看oracle客户端和服务端的版本是否一致?可能是版本问题导致的
      

  5.   

    程序就运行在装oracle的服务器上.
      

  6.   

    oracle版本:8.1.7.0.0
    是否oracle的shared_pool和data buffer导致的?如果是的话,在8i的版本下面怎么清理这些东东?试过了 alter system flush shared_pool,但没有用.