当前位置:  开发笔记 > 数据库 > 正文

将sqlite数据库从内存同步到文件

如何解决《将sqlite数据库从内存同步到文件》经验,为你挑选了2个好方法。

我正在编写一个应用程序,它必须经常记录信息,比如说,一秒钟两次.我希望将信息保存到sqlite数据库,但我不介意每十分钟提交一次磁盘更改.

使用文件数据库时执行查询需要很长时间,并使计算机滞后.

一个可选的解决方案是使用内存数据库(它适合,不用担心),并不时将其同步到磁盘,

可能吗?有没有更好的方法来实现它(你能告诉sqlite只在X查询后提交到磁盘吗?).

我可以解决这个用QtSQL包装器?



1> Mike Willeke..:

假设您有一个名为"disk_logs"的磁盘数据库,其中包含一个名为"events"的表.您可以将内存数据库附加到现有数据库:

ATTACH DATABASE ':memory:' AS mem_logs;

在该数据库中创建一个表(完全在内存中)以接收传入的日志事件:

CREATE TABLE mem_logs.events(a, b, c);

然后在应用程序停机期间将数据从内存表传输到磁盘表:

INSERT INTO disk_logs.events SELECT * FROM mem_logs.events;

然后删除现有内存表的内容.重复.

这很复杂但是......如果你的记录跨越多个表并且与外键链接在一起,那么当你从内存表复制到磁盘表时保持这些表同步可能会很麻烦.

在尝试这样的事情(令人不舒服的过度设计)之前,我还建议尝试让SQLite尽可能快地完成.SQLite应该能够轻松地每秒处理> 50K记录插入.每秒两次的几个日志条目不应导致显着的减速.



2> Mike Willeke..:

如果你在自己的交易中执行每个插入 - 这可能是你所看到的减速的重要因素.也许你可以:

计算到目前为止插入的记录数

开始交易

插入您的记录

增量计数

插入N条记录时的提交/结束事务

重复

不利的一面是,如果系统在此期间崩溃,您可能会失去未提交的记录(但如果您愿意使用内存数据库,那么听起来您的风险就好了).

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有