最近用到了ACE的UUID,使用方法是网上找的,如下:
tstring sUuid;
ACE_Utils::UUID_GENERATOR::instance()->init();
ACE_Utils::UUID uuid;
ACE_Utils::UUID_GENERATOR::instance()->generateUUID(uuid);
sUuid.assign(uuid.to_string ()->c_str ())
return sUuid;
将这段代码封装成一个函数,在很多地方都用到了他,结果问题出来了,在linux环境中连接数据库的时候报系统资源不足,在windows环境跑着没有任何问题。
最开始的时候根本没怀疑到UUID上去,还以为是其他哪里的问题,当时看系统限制的进程打开文件句柄数是1024,通过跟踪程序,发现程序的socket句柄一直在涨,当时程序用到socket的地方只有发送UDP数据和连接数据库,于是使劲在那里面找,把人都快弄残废了。最后逐步排查,费了九牛二虎之力,才找到UUID上。
最后一看ACE的源代码,发现在ACE_Utils::UUID_GENERATOR::instance()->init();函数中打开了一个socket没有关闭,代码如下
#elif defined (linux)
struct ifreq ifr;
ACE_HANDLE handle =
ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);
if (handle == ACE_INVALID_HANDLE)
{
return -1;
}
ACE_OS::strcpy (ifr.ifr_name, "eth0");
if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0)
{
ACE_OS::close (handle);
return -1;
}
struct sockaddr* sa =
(struct sockaddr *) &ifr.ifr_addr;
ACE_OS::memcpy (node->node,
sa->sa_data,
6);
return 0;
#else
里面的handle句柄在后面没有正常关闭。
由于我们用的是ACE5.4版本,于是我想看看最新的5.5.3版本是怎么样的,结果5.5.3版本的代码如下:
#elif defined (linux)
struct ifreq ifr;
ACE_HANDLE handle =
ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);
if (handle == ACE_INVALID_HANDLE)
return -1;
ACE_OS::strcpy (ifr.ifr_name, "eth0");
if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0)
{
ACE_OS::close (handle);
return -1;
}
struct sockaddr* sa =
(struct sockaddr *) &ifr.ifr_addr;
ACE_OS::close (handle);
ACE_OS::memcpy (node->node,
sa->sa_data,
6);
return 0;
#else
handle已经关闭了,估计是新版本修复了这个bug
由于不方便将ACE版本升级到最新版本,最后只能在自己的代码中控制只调用一次ACE_Utils::UUID_GENERATOR::instance()->init()函数,不知道这样后,生成的UUID还是不是真正的UUID,需要仔细研究下
分享到:
相关推荐
Ace-Security是Spring Cloud实战项目中的一个关键组件,主要负责安全相关的配置和实现。这个模块通常包含了身份验证(Authentication)、授权(Authorization)以及其他的访问控制功能。通过Ace-Security,我们可以...
3. Data Source:UUID为22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB,提供详细数据,当控制命令执行后,通过此特性返回结果。 在Notification Source发送的消息中,包含了EventID(消息类型,如添加、修改、删除)、...
conn->ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\MyDatabase.accdb;Persist Security Info=False;"; conn->Open(); ``` 在上述代码中,连接字符串指向了Access数据库文件的位置。 ...
请注意,由于安全性和兼容性问题,现代版本的Access可能需要使用`Microsoft.ACE.OLEDB.12.0`提供程序,而不是`Microsoft.Jet.OLEDB.4.0`,特别是当处理ACCDB格式的数据库时。 总结,通过VC++使用ADO,我们可以轻松...
// 如果使用的是Access 2000以上的版本,则Provider应该是“Microsoft.ACE.OLEDB.12.0”。 } catch (_com_error e) { // 处理异常... } ``` 这里需要注意的是,`Provider`属性指定了使用哪种数据库驱动程序,而`...
conn->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\MyDatabase.accdb", "", "", adConnectUnspecified); ``` 这里,“Provider”指定数据提供程序,"Data Source"是数据库文件路径,空字符串代表...
对于Access 2007及更高版本的.accdb文件,应使用`Provider=Microsoft.ACE.OLEDB.12.0`。 通过以上步骤,你可以在VC++中通过ADO有效地读写Access数据库。这种方式简洁且易于理解,适合处理简单的数据库操作。对于更...
- 数据库连接字符串可能会根据数据库驱动的不同而变化,例如,这里使用的"Microsoft.Jet.OLEDB.4.0"驱动适用于较旧的DBF文件,新的可能是"Microsoft.ACE.OLEDB.12.0"。 - 为确保数据完整性和一致性,应该在事务中...
conn->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myWorkbook.xlsx;Mode=ReadWrite;Extended Properties=\"Excel 12.0 Xml;HDR=YES\";", "", "", ADODB::adConnectUnspecified); ADODB::_RecordsetPtr ...
在Microsoft Visual C++ (VC) ...此外,根据Access数据库的版本和你的系统环境,可能需要使用不同的提供者(如`Microsoft.ACE.OLEDB.x.x`),以及相应的ODBC驱动程序。请确保你拥有正确的驱动和库,以避免连接问题。
bstr_t strProvider = _T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\mydatabase.accdb;"); conn->Open(strProvider, _T(""), _T(""), adModeUnknown); ``` #### 3. 执行SQL命令 通过`Command`对象或...
需要注意的是,不同的ACCESS版本可能需要不同的数据库提供者,如早期版本可能使用`Jet.OLEDB.4.0`,而较新的版本可能需要`ACE.OLEDB.12.0`。此外,还要确保数据库文件的权限设置正确,以允许程序进行读写操作。
对于Access数据库,提供商通常是`Microsoft.Jet.OLEDB.4.0`或`Microsoft.ACE.OLEDB.12.0`(用于Access 2007及更高版本)。 然后,你可以创建一个`Command`对象,用以执行SQL语句。例如: ```cpp CComPtr...
此外,注意随着版本更新,连接Access数据库可能需要更换提供者,例如使用`Microsoft.ACE.OLEDB.12.0`替代`Microsoft.Jet.OLEDB.4.0`来兼容Access 2007及更高版本的`.accdb`格式。 最后,对于初学者来说,理解ADO的...
随着信息技术的发展,特别是Microsoft Office组件如Excel的强大功能以及Visual C++(VC)这样的高级编程语言的应用,可以有效地解决这一问题。本文旨在介绍如何利用VC结合ActiveX Data Objects (ADO)技术访问...
在实际应用中,还需要考虑错误处理、内存管理以及性能优化等问题。例如,使用批处理操作可以提高写入效率。另外,如果数据量较大,可能需要使用事务来确保数据的一致性。 总的来说,通过ADO和C++,我们可以灵活地对...
值得注意的是,不同版本的Access可能需要不同的数据提供者,例如,Access 2007及更高版本可能需要使用“Microsoft.ACE.OLEDB.12.0”而非“Microsoft.Jet.OLEDB.4.0”。 在实际开发中,你还需要处理异常和错误,确保...
对于Access数据库,通常使用`Microsoft.Jet.OLEDB.4.0`或`Microsoft.ACE.OLEDB.12.0`(取决于Access版本)作为提供者。 ##### 2. 创建记录集对象 连接数据库后,接下来需要创建记录集对象来存储查询结果。这通常在...
请注意,这里的"Provider=Microsoft.Jet.OLEDB.4.0"可能需要根据Access版本调整为"Microsoft.ACE.OLEDB.x.x"。 接下来,我们讨论如何对Access数据库进行密码保护。Access数据库支持设置用户级和数据库级密码。在...
Excel可以通过ODBC驱动(如Jet或ACE引擎)被视为数据库,允许VC++程序通过SQL查询来读写数据。 4. 数据操作步骤: - 创建Excel应用程序对象:通过`CoCreateInstance`函数实例化`_Application`接口。 - 打开或创建...