QSqlQuery的execBatch方法准实时写oracle数据库

QSqlQuery的execBatch⽅法准实时写oracle数据库
在这个实例中创建⼀个接收线程,同时启动三个任务,每个任务对应⼀个准实时写数据库线程,数据需要写⼊29张表中,每个任务的数据包频率不⼩于200包/秒,对于接收线程来说数据包频率达到不⼩于600包/秒,经过上百此测试显⽰不会丢⼀个包,延时不超过3秒,以下代码只贴出了重要部分代码,数据库表只⽰意性地写了两张表。
1、⾸先在全局头⽂件中创建数据结构:
typedef struct _DB_DATA_BUFFER{
struct timeval tv_RecvTime;
UINT32 DataLen;
平衡电桥unsigned char* Data;
}DB_DATA_BUFFER,*PDB_DATA_BUFFER;
2、创建接收线程:
#include "l_global.h"
extern PGLOBAL_DATA pGlobalData;
extern SIGLIST mSIGLIST[TASK_MAX];
void* DataRecvThread(void* UNUSED(arg))
{
int result;
char RecvBuffer[65536];
struct timeval tv_CurrentTime;
int DataLen;
int TaskIndex;
PINT_PACKET pIntPacket;
兴宁市技工学校
pIntPacket = (PINT_PACKET)RecvBuffer;
gettimeofday(&tv_CurrentTime,NULL);
std::map<int,int>::iterator iterTaskMap;
while(!pGlobalData->bExit)
{
//receive data from udp net
result = recvfrom(sock[0], RecvBuffer, 65536, 0, (struct sockaddr*)&m_src_addr, &len);
//*************************************************
pGlobalData->LockFormapTaskId.lock();
iterTaskMap = pGlobalData->mapTaskIdToIndex.find(pIntPacket->TaskID);
if(iterTaskMap!=pGlobalData-&d())
pGlobalData->LockFormapTaskId.unlock();胎儿标本
break;
}
TaskIndex = iterTaskMap->second;
pGlobalData->LockFormapTaskId.unlock();
DB_DATA_BUFFER mDbDataBuffer;
mDbDataBuffer.tv_RecvTime = tv_CurrentTime; mDbDataBuffer.DataLen = result;
mDbDataBuffer.Data = new unsigned char[result];
memcpy(mDbDataBuffer.Data,pIntPacket,result);
mSIGLIST[TaskIndex].listSig.mutex.lock();
mSIGLIST[TaskIndex].mbuffList.push_back(mDbDataBuffer); mSIGLIST[TaskIndex].listSig.mutex.unlock();
mSIGLIST[TaskIndex].d.wakeAll();
}
return NULL;
}
3、创建三个写数据库线程:
extern PGLOBAL_DATA pGlobalData;
extern SIGLIST mSIGLIST[TASK_MAX];
void* DbRecordThread(void* arg)
{
int TaskIndex = (long)arg;
QSqlDatabase* db;
db = new QSqlDatabase;
//connect Database
//******************
QSqlQuery queryTable1(*db);
QSqlQuery queryTable2(*db);
int num[2];
for(int i = 0;i<2;i++)
{
num[i] = 0;
QVariantList table1L[2];
QVariantList table2L[3];
if(db->isValid())
{
queryTable1.prepare("insert into table1 values (:val1,to_timestamp(:val2,'yyyy-mm-dd hh24.mi.ss.ff'))"); queryTable2.prepare("insert into table1 values (:val1,:val2,to_timestamp(:val2,'yyyy-mm-dd hh24.mi.ss.ff'))"); PINT_PACKET pIntPacket;
PINT_LD pLD = NULL;
PINT_BD pBD = NULL;
龟甲网while(!pGlobalData->bExit)
{
mSIGLIST[TaskIndex].listSig.mutex.lock();
if(mSIGLIST[TaskIndex].mbuffList.size()==0)
{
mSIGLIST[TaskIndex].d.wait(&mSIGLIST[TaskIndex].listSig.mutex);
}
if(mSIGLIST[TaskIndex].mbuffList.size()>0)
{
DB_DATA_BUFFER mDbDataBuffer;
mDbDataBuffer = mSIGLIST[TaskIndex].mbuffList[0];
mSIGLIST[TaskIndex].veAt(0);
mSIGLIST[TaskIndex].listSig.mutex.unlock();
mSIGLIST[TaskIndex].d.wakeAll();
//go to record things to DB
pIntPacket = (PINT_PACKET)mDbDataBuffer.Data;
switch(pIntPacket->BID)
{
case 0: //to table1
DbRecordTable1(num,table1L,queryTable1,pLD,&mDbDataBuffer.tv_Recvtime,TaskIndex,db);
break;
case 1: //to table2
维尔斯特
DbRecordTable1(num,table2L,queryTable2,pBD,&mDbDataBuffer.tv_Recvtime,TaskIndex,db);
break;
delete mDbDataBuffer.Data;
}else
{
mSIGLIST[TaskIndex].listSig.mutex.unlock();
mSIGLIST[TaskIndex].d.wakeAll();
}
}
}
}
int DbRecordTable1(int (&num)[2],QVariantList (&list)[2],QSqlQuery query,PINT_LD pLD,struct timeval* tv_Recvtime,int taskid,QSqlDatabase* db)
{
if(!dataEnd[taskid])
{
list[0].append(pBD->TID);
//tv_Recvtime change to recvT
list[1].append(recvT);
num[0]++;
}
if(num[0]<1000&&!dataEnd[taskid])
{
return 0;
}else
{
num[0] = 0;
for(int i = 0;i<2;i++)
{
query.addBindValue(list[i]);
}
db->transaction();
异常蛋if(!Batch())
{
qDebug()<<"error: "<<query.lastError();
db->commit();
return 1;
}
db->commit();
for(int i = 0;i<2;i++)
{
list[i].clear();
}
return 2;
}
}
int DbRecordTable2(int (&num)[2],QVariantList (&list)[3],QSqlQuery query,PINT_BD pBD,struct timeval* tv_Recvtime,int taskid,QSqlDatabase* db)
{
if(!dataEnd[taskid])
{
list[0].append(pBD->TID);
//tv_Recvtime change to recvT
list[1].append(recvT);
num[1]++;
}
if(num[1]<2000&&!dataEnd[taskid])
{
return 0;
}else
{
num[1] = 0;
for(int i = 0;i<3;i++)
{
query.addBindValue(list[i]);
}
db->transaction();
if(!Batch())
{

本文发布于:2024-09-21 04:23:31,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/24922.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   数据库   创建
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议