使用sqlite3进行数据库写操作,每插入一条数据都会回写到磁盘上,这样会导致写数据库的效率低,而且增加磁盘的擦写次数。为了解决该问题,我们可以将数据写入内存数据库中,定时把内存数据库的数据保存到文件数据库中,较少磁盘的操作次数。
C代码实现思路:
1.创建文件数据库;
2.创建内存数据库;
3.创建文件数据库表格;
4.创建内存数据库表格(和文件数据表格一致);
5.内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见;
6.将数据写入内存数据表格中;
7.定时将内存数据中的内容写入文件数据库中;
#include#include #include #include "sqlite3.h" int main(int argc, const char *argv[]) { sqlite3 * filedb=NULL; sqlite3 * memdb=NULL; char sqlcmd[512] = {0}; char *errMsg = 0; unsigned int i=0; char path[50]="/mnt/usb1/test.db"; while(1) { //创建文件数据库; if(sqlite3_open(path,&filedb) != SQLITE_OK) { printf("%sn",sqlite3_errmsg(filedb)); exit(-1); } else { printf("filedb open %s successn",path); } //创建内存数据库; if (SQLITE_OK != sqlite3_open(":memory:", &memdb)) { printf("%sn",sqlite3_errmsg(memdb)); exit(-1); } else { printf("memdb open %s successn",path); } //创建数据表,包括内存数据库中和文件数据库中,文件数据库、内存数据库的表结构需要一致。 sprintf(sqlcmd, "CREATE TABLE testTable(ID TEXT,value);") ; if(sqlite3_exec(filedb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK) { printf("filedb creat table err:%sn",errMsg); } else { printf("filedb creat table sucn"); } sqlite3_free(errMsg); if(sqlite3_exec( memdb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK) { printf("memdb creat table err:%sn",errMsg); } else { printf("memdb creat table sucn"); } sqlite3_free(errMsg); //内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见; snprintf(sqlcmd, sizeof(sqlcmd), "ATTACH '%s' AS %s", path, "filedb"); if (SQLITE_OK != sqlite3_exec(memdb, sqlcmd, 0, 0, &errMsg)) { printf("Failed to attach, err msg:%sn",errMsg); sqlite3_free(errMsg); } else { printf("attach successfullyn"); } sqlite3_free(errMsg); //将数据插入内存数据库中 for(i=0;i<100;i++) { sprintf(sqlcmd, "INSERT INTO testTable VALUES (%s,%d);","1234",i); //reset if(sqlite3_exec(memdb, sqlcmd, 0, 0, &errMsg) != SQLITE_OK) { printf("insert err:%sn",errMsg); exit(-1); } sqlite3_free(errMsg); } //定时将内存数据库中的内容flush到文件数据库。 if (SQLITE_OK != sqlite3_exec(memdb, "INSERT OR REPLACe INTO filedb.testTable SELECT * FROM testTable;", 0, 0, &errMsg)) { printf("sync err msg:%sn",&errMsg); } else { printf("sync sucn"); } sqlite3_free(errMsg); //删除内存数据库中的内容 if (SQLITE_OK != sqlite3_exec(memdb,"DELETe FROM testTable;",0,0,&errMsg)) { printf("delete err:%sn",errMsg); } else { printf("delete sucn"); } sqlite3_free(errMsg); sqlite3_close(memdb); sqlite3_close(filedb); exit(0); } }



