CRecordset 的 Addnew 和 Execute Command 插入数据的性能分析






2.67/5 (6投票s)
一篇关于高效地向数据库添加行的文章
引言
在使用 C++ 开发一个视频数据库服务器项目时,我发现实时向数据库添加数据条目对性能至关重要。尤其是在数据速率很高的情况下。 在我的例子中,我每秒收到四条字幕信息或句子——每天 345600 条——我需要记录整整一年的数据。 我将从套接字接收到的数据输入到我的数据库服务器中。 为了避免远程断开连接和瓶颈,我本地输入数据。 否则,如果连接中断,可能会造成灾难。 我在单个服务器上运行这个软件的实例超过二十个,但使用不同的端口。 以这种速率向数据库添加数据在时间和内存领域都是一个性能问题。
背景
具备通过 C++ 或 C# 进行数据库编程的一些背景知识足以理解本文。
使用代码
//SQL Command
--INSERT INTO [DEV3].[dbo].[DEV303]([longdate],[longtime],[ColeDateTime],[TEXT])
--VALUES ('1921212','121212','2007/3/30 17:08:44','Some Text ')
以下两个函数被编写用于在从 recevData
接收到数据后实时插入一些数据。
SaveinSQLInsert
void ServerRecev::SaveinSQLInsert(char * recevData )
{
// Some Code to do with recevData
////////////////////////Adding to Database//////////////////////////
CString csUser = "sa";
CString csPwd = "";
CString csServer = "(local)";
CString csDatabase = clientname ;
strConnection.Format(
"Provider=sqloledb;Data Source=%s;Initial Catalog=%s;" +
"Integrated Security=SSPI;",
csServer,csDatabase);
CString Query =
"INSERT INTO [DEV3].[dbo].[DEV303]([longdate]," +
"[longtime],[ColeDateTime],[TEXT] )" +
" VALUES ('1921212','121212','2007/3/30 17:08:44','Some Text ' )";
try
{
if(m_pDb.Open(strConnection))
{
CADOCommand pCmd( &m_pDb , Query , CADOCommand::typeCmdText);
m_pRs = CADORecordset(&m_pDb);
m_pRs.Execute( &pCmd );
}
}
catch (CADOException _e)
{
_e.GetErrorMessage();
AfxMessageBox(_e.GetErrorMessage());
}
}
SaveinSQL
void ServerRecev::SaveinSQL(char * recevData )
{
//Some Code to do with recevData
//////////////////////////Adding in Database/////////////////////////
CADORecordset m_pRs;
CADODatabase m_pDb;
CString strConnection ;
CString csUser = "sa";
CString csPwd = "";
CString csServer = "(local)";
CString csDatabase = clientname ;
strConnection.Format(
"Provider=sqloledb;Data Source=%s;Initial Catalog=%s;" +
"Integrated Security=SSPI;",
csServer,csDatabase);
try
{
if(m_pDb.Open(strConnection))
{
m_pRs = CADORecordset(&m_pDb);
//if(m_pRs.IsOpen() == TRUE)
{
CString strtable = clientname + Date;
if(m_pRs.Open( strtable , CADORecordset::openTable))
{
//if(m_pRs.IsOpen() ==TRUE)
{
m_pRs.AddNew();
m_pRs.SetFieldValue(0, longdate );
m_pRs.SetFieldValue(1 , longtime );
m_pRs.SetFieldValue(2 , oledt);
m_pRs.SetFieldValue(3 , strdata );
m_pRs.Update();
}
//m_pRs.Close();
}
//m_pDb.Close();
}
}
}
catch (CADOException _e)
{
_e.GetErrorMessage();
AfxMessageBox(_e.GetErrorMessage());
}
}
关注点
我编写了两个函数。 第一个,SaveinSQLInsert
,使用 INSERT
命令并通过 ADO 库执行它。 第二个,SaveinSQL
,使用 Addnew
命令将数据输入数据库。 包含这些函数的线程以每秒 20 次的速度运行。 数据通信是同步的,但数据注册到数据库是异步的,因为它会检查数据是否重复。 我建议使用 INSERT
命令将数据插入数据库,并通过 CRecordset
类的 execute
命令执行它。
图片显示了这两个函数如何影响 CPU 和内存的使用情况。 上图显示了 INSERT
命令,下图显示了 AddNew
命令来添加数据。 在两种情况下,都可以直观和数值地比较 CPU 使用率的百分比。 我有意地将这两个进程都运行在 processor1
中,因为我拥有双核技术,并且可以在单处理器机器上进行良好的比较。 我的机器规格如下:Dell Precision PWS690 Intel Xeon CPU 5130 @ 2.00GHz 和 2.00GHz 2.00GBRAM。
使用的库:ado2.h 和 ado2.cpp 版本 2.20,作者为 Carlos Antollini。 这段代码是在英国伦敦的 Intelligent Media 编写的。
历史
- 2007 年 6 月 28 日 -- 发布原始版本
- 2007 年 6 月 29 日 -- 将源代码下载添加到文章中