概述

使用sqlite3进行数据库写操作,每插入一条数据都会回写到磁盘上,这样会导致写数据库的效率低,而且增加磁盘的擦写次数。为了解决该问题,我们可以将数据写入内存数据库中,定时把内存数据库的数据保存到文件数据库中,较少磁盘的操作次数。

C代码

实现思路:
1.创建文件数据库;
2.创建内存数据库;
3.创建文件数据库表格;
4.创建内存数据库表格(和文件数据表格一致);
5.内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见;
6.将数据写入内存数据表格中;
7.定时将内存数据中的内容写入文件数据库中;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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("%s\n",sqlite3_errmsg(filedb));
			exit(-1);
		}
		else
		{
			printf("filedb open %s success\n",path);
		}
		//创建内存数据库;
		if (SQLITE_OK  != sqlite3_open(":memory:", &memdb))
		{
			printf("%s\n",sqlite3_errmsg(memdb));
			exit(-1);
		}
		else
		{
			printf("memdb open %s success\n",path);
		}

		//创建数据表,包括内存数据库中和文件数据库中,文件数据库、内存数据库的表结构需要一致。
		sprintf(sqlcmd, "CREATE TABLE testTable(ID TEXT,value);") ;
		if(sqlite3_exec(filedb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK)
		{
			printf("filedb creat table err:%s\n",errMsg);
		}
		else
		{
			printf("filedb creat table suc\n");
		}
		sqlite3_free(errMsg);

		if(sqlite3_exec( memdb , sqlcmd , 0 , 0 , &errMsg ) != SQLITE_OK)
		{
			printf("memdb creat table err:%s\n",errMsg);
		}
		else
		{
			printf("memdb creat table suc\n");
		}
		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:%s\n",errMsg);
			sqlite3_free(errMsg);
		}
		else
		{
			printf("attach successfully\n");
		}
		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:%s\n",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:%s\n",&errMsg);
		}
		else
		{
			printf("sync suc\n");
		}
		sqlite3_free(errMsg);
		//删除内存数据库中的内容
		if (SQLITE_OK != sqlite3_exec(memdb,"DELETE FROM testTable;",0,0,&errMsg))
		{
			printf("delete err:%s\n",errMsg);
		}
		else
		{
			printf("delete suc\n");
		}
		sqlite3_free(errMsg);
		sqlite3_close(memdb);
		sqlite3_close(filedb);
		exit(0);
	}
}

更多推荐