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);

时间: 2024-10-09 19:29:53

VC+ADO访问数据库发现进程句柄数增加的相关文章

Oracle oledb 打包并集成到程序安装包(VC ADO访问Oracle)

最近有一个项目和oracle交互,我用的是ADO的方式进行试问操作. 首先把数据库连接的东东记录一下,老了记性不好啊! 操作如下: //连接串这么写的话就可以不用配置 tnsnames.ora配置文件了(网上很多教程都让改这个配置文件) strConnect.Format("Provider=OraOLEDB.Oracle.1;Password=%s;Persist Security Info=True;User ID=%s;\ Data Source=\"(DESCRIPTION =

解决用 VB 中用 ADO 访问 数据库时 SQL 查询处理 Null 值的问题( 使用 iff(isNull(字段), 为空时的值,不为空时的值) 来处理)

程序的环境是 VB6 + ADO + Access,在用 SQL 语句查询时,希望把两个字段合并成一个字段,但其中一个字段 Null 值直接导致两个字段合并后也变成了 Null 值.之前只能用 VB 中的 IsNull 分别处理两个字段的值,前段时间想尝试用 SQL 语句直接解决,确一直未能成功, 差点放弃之际找到了答案,总结如下: 目的: 实现 Select ( 字段1 +  字段2 ) As A 问题: 字段2 如果为空值 (Null),则 不论字段1 的值是否为空,A 的值为空值 (Nul

Delphi通过ADO读写数据库

ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据. ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据.例如,如果您希望编写应用程序从DB2或Oracle数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中.当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果. 在Delphi 5.0 以上的

ADO.NET(数据库访问技术)

[ADO.net结构]: ADO.NET用于访问和操作数据库的两个主要组件是:.NET Framework 数据提供程序和DataSet. a..NET Framework数据提供程序:是专门为数据操作设计的组件,用于处理不同的数据源,支持访问特定的数据库.执行SQL命令和检索结果. b..NET Framework数据提供程序包含4个核心对象:  Connection:(连接)建立与特定数据源的连接:   Command:(命令)对数据源执行命令:   DataReader:( 数据读取)从数

ADO访问Access数据库错误解决

最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010; Access2000~Access2003连接串建立数据库连接. 关键数据库操作代码 BOOL CAccessDatabase::Query(const CString strSQLString, UINT nFieldNumber, vector<vector<_variant_t> >& vec

ADO访问Access数据库错误解决心得随笔

最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~Access2003连接串建立数据库连接. 关键数据库操作代码 BOOL CAccessDatabase::Query(const CString strSQLString, UINT nFieldNumber, vector<vector<_variant_t> >& vec

ASP.NET MVC- EF返回连接池用ADO.NET方式访问数据库

用习惯了ADO.NET的方式去访问数据库,虽然ADO.NET写的代码没有EF简洁,可是也并不麻烦.而且EF在进行多表查询的那种方式是,EF需要先去数据库里定义外键,再进去一次代码生成,然后才能用INCLUDE方法进行多表关联查询.我不太喜欢那样,还不如老老实实写做SQL语句. 所以ADO.NET 不能完成不用掉.那么怎么将EF和ADO.NET结合. 其实很简单,只要将EF的连接池返回成ADO.NET的SQLCONNECTION.然后就可以用ADO.NET的方式来写了. protected voi

ADO.NET数据库访问技术(转)

这几天的自学,现在总结一下关于C#中连接数据库的一些知识点: 1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: server=服务器名:database=数据库名:uid=用户名:pwd=密码:例如:要连接本机上的StudentManagement数据库,用户名为sa,密码为111 string connString="server=.;datab

使用ADO.NET访问数据库-----的解析

一.ADO.NET :用于连接数据库的技术 1.ADO.NET分为两大组件 DataSet:数据集 .NET FRAMWORK :用于连接到数据库,发送命令,检索结果 2.ADO.NET四大核心对象 Connection Command DataAdapter DataReader 二.使用ADO.NET访问数据库 1.首先导入命名空间System.Data.SqlClient 2.创建连接字符串 String constr="Data Source=.;Initial Catalog=Scho