sqlite3内存数据库与文件数据库的应用总结
概述使用sqlite3进行数据库写操作,每插入一条数据都会回写到磁盘上,这样会导致写数据库的效率低,而且增加磁盘的擦写次数。为了解决该问题,我们可以将数据写入内存数据库中,定时把内存数据库的数据保存到文件数据库中,较少磁盘的操作次数。C代码1.创建文件数据库;2.创建内存数据库;3.创建文件数据库表格;4.创建内存数据库表格(和文件数据表格一致);5.内存数据库中attach文件数据库,这样可以保
·
概述
使用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);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)