在对sqlite3 insert into等操作时速度比较慢。
原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。
解决办法:用事物的形式提交,因为开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
接口:事务的操作没有特别的接口函数,就是一个普通的sql语句而已,分别如下:
intret; |
例程:在进行大量的操作前使用如下语句
retzErrorMsg); |
从sql.txt中读出sql语句,并一一执行,若有一条执行失败,则所有执行全部不生效。回滚到执行前的状态。
- #include<stdio.h>
- #include<sqlite3.h>
- #definesql_FILE"./sql.txt"
- intcommitsql(sqlite3*db)
- {
- intret=0;
- FILE*fp;
- charbuf[100]={0};
- char*errmsg=0;
- char**azResult;
- inti,nRow=0,nColumn=0;
- fp=fopen(sql_FILE,"r");
- if(NULL==fp)
- return-1;
- ret=sqlite3_exec(db,"BEGINEXCLUSIVE",NULL,&errmsg);
- if(ret!=sqlITE_OK)
- {
- printf("ret=%d,BEGINEXCLUSIVE:%s",ret,errmsg);
- }
- while(NULL!=fgets(buf,100,fp))
- printf("%s\n",buf);
- if(0==strncmp(buf,"select",6))
- ret+=sqlite3_get_table(db,buf,&azResult,&nRow,&nColumn,&errmsg);
- ,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> printf("row:%dcolumn=%d\n",nRow,nColumn);
- for(i=nColumn;i<(nRow+1)*nColumn;i++)
- printf("azResult[%d]=%s\n",i,azResult[i]);
- }
- sqlite3_free_table(azResult);
- else
- ret+=sqlite3_exec(db,&errmsg);
- if(sqlITE_OK!=ret)
- printf("ret=%d,sql:%s\n",errmsg);
- break;
- if(ret==sqlITE_OK)
- "COMMIT",COMMIT:%s\n","ROLLBACK",ROLLBACK:%s\n",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> sqlite3_free(errmsg);
- fclose(fp);
- return-2;
- returnret;
- intmain()
- sqlite3*db;
- char*dbPath="test.db";
- intret=0;
- ret=sqlite3_open(dbPath,&db);
- if(ret==sqlITE_OK)
- printf("opensucceed\n");
- else
- printf("openfail\n");
- ret=commitsql(db);
- printf("ret=%d\n",ret);
- sqlite3_close(db);
- }