嵌入式linux下sqlite_exec会导致阻塞吗

chenaiming 2011-07-22 09:04:23
嵌入式linux下一个单线程的数据冻结程序,每1分钟对电压、电流等遥测量冻结入库1次,数据库为sqlite-3.6.20。测试中发现,运行一段时间后,程序会一直阻塞在sqlite3_exec函数那儿,CPU占比为99%以上。主要代码如下:
int i;
int count = 40;
struct stAnalogData rec[count];
memset(&rec[0], 0, sizeof(rec));

if(!dbop->BeginTransaction())
{
dbop->Close();
return 0;
}
try
{
for(i=0; i< count; i++)
{
rec[i].boardaddr = 2;
rec[i].group = 1;
rec[i].itemtype = i;
rec[i].valid = 1;
rec[i].tm_s = time(NULL);

unsigned long long tm_tmp = rec[i].tm_s;
rec[i].tm_s = tm_tmp - (tm_tmp%time_tick); //规整到time_tick的计时级别
if( !dbop->InsertAnalogData(rec[i]) )
{
dbop->Close();
break;
}
CSysLog::Info("insert analog data to DB. addr=%d, group=%d, itemtype=%d, val=%f, valid=%d, tm_s=%s",
rec[i].boardaddr, rec[i].group, rec[i].itemtype, rec[i].val, rec[i].valid, ctime((const time_t *)&rec[i].tm_s));

}
dbop->CommitTransaction();
}
catch(...)
{
printf("catch fatal error in RecordData()!\n");
CSysLog::Error("catch fatal error in RecordData()!");

dbop->RollbackTransaction();
dbop->Close();
return 0;
}


bool CDBOper_Sqlite::BeginTransaction()
{
char sql[32];
sprintf(sql, "BEGIN TRANSACTION");
return Exec(sql);
}

bool CDBOper_Sqlite::RollbackTransaction()
{
char sql[32];
sprintf(sql, "ROLLBACK TRANSACTION");
return Exec(sql);
}

bool CDBOper_Sqlite::CommitTransaction()
{
char sql[32];
sprintf(sql, "COMMIT TRANSACTION");
return Exec(sql);
}

bool CDBOper_Sqlite::InsertAnalogData(const stAnalogData &data)
{
char sql[128];
sprintf(sql, "insert into TANALOGDATA values(NULL, %d, %d, %d, %f, %d, %llu)",
data.boardaddr, data.group, data.itemtype, data.val, data.valid, data.tm_s);
printf("sql:%s. sql len=%d\n", sql, strlen(sql));
return Exec(sql);
}

bool CDBOper_Sqlite::Exec(const char *sql)
{
if( m_db==NULL )
{
return false;
}
if( sql==NULL )
{
return false;
}

char *szErrMsg = 0;
printf("prepare to call sqlite3_exec\n");
int rc = sqlite3_exec( m_db, sql, 0, 0, &szErrMsg );
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error:%s\n", szErrMsg);
printf("prepare to call sqlite3_free\n");
sqlite3_free(szErrMsg);
return false;
}
printf("prepare to call sqlite3_free\n");
sqlite3_free(szErrMsg);
return true;
}
...全文
364 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenaiming 2011-08-04
  • 打赏
  • 举报
回复
因为本程序只是做插入记录的操作,没有返回结果,因此没有采用callback的方式。
请教4楼,sqlite3_exec 怎样设置阻塞或非阻塞?
healer_kx 2011-08-04
  • 打赏
  • 举报
回复
sqlite_exec是不是阻塞的,不是代码设定的吗?你可以指定callback的方式。
chenaiming 2011-08-04
  • 打赏
  • 举报
回复
本程序只有一个main主线程!系统中另外一个程序对数据库是只读的。而且阻塞就发生在sqlite3_exec调用中!!!是运行很间才出现的。
大家都没有遇到这种情况吗?已经好多天了,都没解决。。。
至善者善之敌 2011-08-02
  • 打赏
  • 举报
回复
既然阻塞了,看看是什么原因导致的?

线程A等待线程B的数据,线程B等待线程A的数据,互相等待,就会陷入阻塞,这也是一种线程阻塞。

阻塞状态是正在运行的线程遇到某个特殊情况。例如,延迟、挂起、等待I/O操作完成等。 进入阻塞状态的线程让出CPU,并暂时停止自己的执行。线程进入阻塞状态后,就一直等待,
  • 打赏
  • 举报
回复
看看。。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧