• VC+ADO访问数据库发现进程句柄数增加


    程序功能:

    实现了一个TCP Server端,接收到客户端连接后,新增一个单独的线程与客户端交互,中间有数据库操作,完成后线程关闭。

    实现方式是VC++,数据库访问采用的是ADO,数据库是Mariadb,odbc数据源,  mysql-connector。

    最初的方式是每次数据库操作都是  新建ADO._Connection,打开链接,查询或提交,关闭链接 ;

    问题:

    结果发现运行一段时间后进程句柄数一直在增加,然后就挂了。

    解决:

    修改为使用ADO的连接池,重用程序启动时创建的连接池中的连接,从结果看是句柄数正常了,没有出现句柄数一直增加的情况。

    实现方式如下:

    (ADO是基于COM的,涉及到跨线程调用的问题,故采用全局接口表的方式)

    首先在程序主线程

    获取全局接口表指针

    ::CoInitialize(NULL);

    HRESULT hr = S_OK;

    CComPtr<IGlobalInterfaceTable>gpGIT;

    hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,

                                NULL,

                                CLSCTX_INPROC_SERVER,

                                IID_IGlobalInterfaceTable,

                                (void **)&gpGIT);

    创建个ADO._Connection对象的数组m_spAdoConn,实例化对象。并注册到全局接口表,保存对应的cookieid。

    for(int i=0;i<N;i++)

    {

    hr = m_spAdoConn[i].CoCreateInstance(__uuidof(Connection));

    ATLASSERT(SUCCEEDED(hr));

    hr = m_spAdoConn[i]->Open(_bstr_t(szDsn),_bstr_t(""),_bstr_t(""),0);

    //注册到GIT

    DWORD dwCookie = 0;

    gpGIT->RegisterInterfaceInGlobal(m_spAdoConn[i],__uuidof(_Connection),&dwCookie);

    gitInfo[i].cookieId = dwCookie;

    }

    控制_Connection的使用,我选择的是使用Semaphore

    hSem =  CreateSemaphore(N)

    在访问数据库之前首先waitforsingleobject(hSem),从gitInfo中获取空闲的句柄,获取后置为使用中。

    在使用完成后将对应的句柄标识为空闲。释放hSem。

    因gitInfo需要多线程使用,使用了一个单独的CriticalSection控制。

    for(int i=0;i<=N;i++){

    if(gitInfo[i].blLocked==FALSE)

    {

    gitInfo[i].blLocked=TRUE;

    cookieId = gitInfo[i].cookieId;

    break;

    }

    }

    CComPtr<IGlobalInterfaceTable>gpGIT;

    hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,

                                NULL,

                                CLSCTX_INPROC_SERVER,

                                IID_IGlobalInterfaceTable,

                                (void **)&gpGIT);

    ATLASSERT(SUCCEEDED(hr));

    gpGIT->GetInterfaceFromGlobal(cookieId,__uuidof(_Connection),(void**)&spConn);

    2017-2-13  

      从实际使用情况看仍不理想,而且代码复杂化了,感觉不爽。于是做了如下修改:

        用ZeroMQ写了一个server端 SA,tcp server收到的消息首先发送到SA缓存起来,这样tcp server响应就没有问题了。

        用ZeroMQ写了一个client端CA,功能是从SA获取消息并写到数据库,CA可以启动多个。

          client内部做了个设置,操作1000次数据库之后关闭自己,再重启一个client进程。

  • 相关阅读:
    MetaWeblog API
    序列化Hashtable
    贴几个CodeDOM的链接
    Summing it all up: 35 blog entries in 2 days from the BCL Team [Kit George] --from BCLTeam's Weblog
    上海在下尘土
    PSP升级速度令然惊喜!(update:2007.10.13)
    Linkin Park林肯公园上海演唱会(2007年11月18日)
    STARCRAFT2 / 星际争霸2
    Enterprise Library 3.0 April 2007
    《The Devil Wears Prada / 穿布拉达的女王》很有意思.
  • 原文地址:https://www.cnblogs.com/fangjx/p/5345628.html
Copyright © 2020-2023  润新知