嵌入式linux下sqlite_exec会导致阻塞吗
嵌入式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;
}