免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6395 | 回复: 4
打印 上一主题 下一主题

[应用] 嵌入式linux下sqlite3_exec什么情况下会导致阻塞?! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-22 09:12 |只看该作者 |倒序浏览
本帖最后由 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;
}

论坛徽章:
0
2 [报告]
发表于 2011-08-04 22:32 |只看该作者
本帖最后由 chenaiming2009 于 2011-08-04 22:36 编辑

请大家帮忙看看啊,已经盯了这个问题好些天了,一直没解决!!!每次都是同样的堵塞在sqlite3_exec函数调用这儿,通过top查看到本进程的CPU占比为99%多,整个嵌入式系统也就死在那儿了。。。确实想不明白,退一步讲,即使sqlite3_exec是阻塞调用,也不应该出现CPU一直满负荷的情况啊?!

论坛徽章:
0
3 [报告]
发表于 2011-08-05 08:44 |只看该作者
如果很容易再现的话,在sqlite3_exec内部加log 进一步跟踪,确定位置

论坛徽章:
1
子鼠
日期:2013-08-23 16:36:37
4 [报告]
发表于 2011-08-05 13:33 |只看该作者
先确定是sqlite的问题还是自身程序的问题。

论坛徽章:
0
5 [报告]
发表于 2011-08-17 10:26 |只看该作者
回复 4# float001


    自身程序应该没问题,程序每次都是阻塞在同样的地方,即sqlite3_exec函数调用中。经过跟踪,发现是里面的sqlite3_step函数引起阻塞。更进一步,发现是sqlite3Step函数引起的。

真是没办法了,SQLITE的API函数介绍里都没有说此函数有阻塞的情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP