采用短连接,使用ADO连接oracle,每6秒钟执行一次连接和释放,即使中间什么操作也不作,该程序所占用句柄数仍然增长很快,系统不久会崩溃?如何解决?下面是
采用的ADO的部分代码:
while(1)
{
...
_ConnectionPtr pConn;CString strConnection = "Provider=MSDAORA;Data Source=" + m_dbserver +
       ";User ID=" + m_username + "; Password=" + m_passwd;
hr = pConn.CreateInstance(__uuidof(connection));if(SUCCEEDED(hr))
{
    hr=pConn->Open((_bstr_t)strConnection,"","",-1);
}...pConn->Close();
pConn = NULL
...sleep(6000);
}如何解决呀????

解决方案 »

  1.   

    pConn- >Close(); 
    pConn- >Release();
      

  2.   

    好像还是再涨,我现在加入了:pConn- >Close(); 
    pConn.Release();
    pConn = NULL 
    ... sleep(6000); 
    } 在release时出现com异常,然后我改为直接release,把close()注释掉,结果句柄增加很快!还有啥高招啊!!!
      

  3.   

    主要考虑是一个长连接不太可靠,如果由于任何原因造成网络临时中断或连接失败,就会出现ORA-03113:通信通道的文件结束,整个连接就断开了无法进行后续操作。说明一下,港此阿改后不会出现COM异常,是我书写错误写成了pConn->Release()了。
      

  4.   

    什么年代了,还用vc做数据库应用啊,呵呵
    快别学了,楼主
    什么年代了,还用vc做数据库应用啊,呵呵
    快别学了,楼主
    什么年代了,还用vc做数据库应用啊,呵呵
    快别学了,楼主
    什么年代了,还用vc做数据库应用啊,呵呵
    快别学了,楼主
      

  5.   

    难道还要用CloseHandle()??? 没有遇到过.一般都是
    pConn->Close();//关闭_Connection
    pConn.Release();//释放COM资源
    顶多再为指针设定为NULL吧.
    没听说还要CloseHandle(pConn)的啊,会不会报错都不知道.
      

  6.   

    不好意思,楼上写错了.不能CloseHandle()!!!
      

  7.   

    问题依旧啊,现在只能牺牲性能来换取稳定的时间更长一些了,将sleep()时间加长来缓解系统崩溃,可毕竟不是正确方法,继续期待中
      

  8.   

    ADO是这样的,连接,记录集关闭了也一样..
      

  9.   

    不知道你的目的是什么?
    安全的释放过程就是pRec->Close();
    pRec.Release;
    pRec=NULLpCommand->Release;
    pCommand=NULL;pConn->Close();
    pConn.Release;
    pConn=NULL;我测试了一下,如果想彻底的释放句柄资源.必需使pConn生命周期结束交给系统释放.如果你是模块化调用,倒也问题不大.模块Destroy后,也就相应的释放了这些局部资源.
      

  10.   

    如果数据库连接意外中断,pConn- >Close()时就会报错,怎么解决啊?可以通过state判断么?
      

  11.   


    ConnectionPtr pConn; //这句移出循环体就可以了
    while(1) 

    ... 
    CString strConnection = "Provider=MSDAORA;Data Source=" + m_dbserver + 
           ";User ID=" + m_username + "; Password=" + m_passwd; 
    hr = pConn.CreateInstance(__uuidof(connection)); if(SUCCEEDED(hr)) 

        hr=pConn->Open((_bstr_t)strConnection,"","",-1); 
    } ... pConn->Close(); 
    pConn = NULL 
    ... sleep(6000); 

      

  12.   

    我的猜想,COM回收机制导致资源没有立即释放,频繁申请接口导致问题出现