- 论坛徽章:
- 0
|
本帖最后由 chenaiming2009 于 2011-07-22 09:23 编辑
嵌入式linux下一个单线程的数据冻结程序,每1分钟对电压、电流等遥测量冻结入库1次,数据库为sqlite-3.6.20。测试中发现,运行一段时间后,程序会一直阻塞在sqlite3_exec函数那儿,CPU占比为99%以上。查过很多资料 ,都没有说明sqlite3_exec会阻塞的情况。。。
主要代码如下:
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++)
{
// test
rec.boardaddr = 2;
rec.group = 1;
rec.itemtype = i;
rec.valid = 1;
rec.tm_s = time(NULL);
unsigned long long tm_tmp = rec.tm_s;
rec.tm_s = tm_tmp - (tm_tmp%time_tick); //规整到time_tick的计时级别
if( !dbop->InsertAnalogData(rec) )
{
dbop->Close();
break;
}
CSysLog::Info("insert analog data to DB. addr=%d, group=%d, itemtype=%d, val=%f, valid=%d, tm_s=%s",
rec.boardaddr, rec.group, rec.itemtype, rec.val, rec.valid, ctime((const time_t *)&rec.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;
} |
|