C++ 使用 SQLite3 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 使用 SQLite3 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?相关的知识,希望对你有一定的参考价值。

找了网上的一个 SQLite3使用的小例子,大致的代码就是打开数据库,然后写一条语句,然后执行啊啥的。就可以对数据库进行曾删改查了,但是通过注释看到打开数据库的时候如果数据库不存在会自动创建(这个可以理解),但是当对这个数据库进行操作的时候,比如增加一条数据,它会将数据保存在当前目录下(名字就是打开数据库指定的名字),也就是意味着它自动将数据写在了磁盘上,内存数据库不是在内存里面进行操作了吗?如果写在磁盘上,那不会很慢了吗?

sqlite一般是用在嵌入式环境里的,嵌入式环境没有很复杂的磁盘处理逻辑,一般直接写入主存
所以在嵌入式环境下,sqlite得数据直接写入主存(即它的“硬盘”)不会慢追问

嗯,我用的是PC机,所以他写到了硬盘上,对吧?但是为什么不常驻内存呢?我的意思是,它直接在内存里面进行操作,不写入磁盘,不如总觉得速度太低。

追答

PC上可以先将操作缓存到内存里哦。
频繁进行增删改的话,建议使用事务处理(transaction),将操作先缓存到内存里,以减少数据库文件打开关闭次数,提升效率:

rc = sqlite3_exec(db, "BEGIN;", 0, 0, &zErrMsg);
//执行SQL语句
rc = sqlite3_exec(db, "COMMIT;", 0, 0, &zErrMsg);

追问

嗯,那怎么缓冲到内存里面呢?需要哪些操作或者配置?

追答

执行BEGIN就是开始缓存的意思啦。
rc = sqlite3_exec(db, "BEGIN;", 0, 0, &zErrMsg);
//执行SQL语句

执行COMMIT就是把缓存到内存东西提交到磁盘上的文件里了哦
rc = sqlite3_exec(db, "COMMIT;", 0, 0, &zErrMsg);

参考技术A 你觉得 像mysql sqlServer oracle这些数据库,数据都保存在哪?常驻内存?
这东西稍微想想就明白,凡是数据库必然是在硬盘上,内存才多点啊。

要知道内存是断电就清空的,数据库存的东西不会是断电就消失吧追问

嗯,大哥,你说的蛮有道理。但是sqlite说的是常驻内存,所以我还准备写一个模块去将它同步到另一台PC的Mysql上。只是我在那个测试程序里面发现他写入了磁盘,所以觉得有点不可思议。而且要是去测试这个数据库的话,那个速度应该是对内存的操作速度和磁盘的读写速度的总和了吧?

以上是关于C++ 使用 SQLite3 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3函数接口

如何创建 sqlite3 内存数据库?

C++ 编译问题,sqlite3

C++ sqlite3使用sqlite3_prepare_v2接口报错,求大神解答

Sqlite3 数据库表无法在 XCode 4.2 中打开

FMDatabase/SQLite3 使用的“打开的文件太多”问题