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

时间:2010-06-22 15:37:06

标签: database qt sqlite

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

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

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

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

我可以使用Qt的{​​{1}}包装器解决此问题吗?

3 个答案:

答案 0 :(得分:11)

假设您有一个名为“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;

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

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

在尝试这样的事情(令人不舒服的过度设计)之前,我还建议trying to make SQLite go as fast as possible。 SQLite应该能够轻松地手动>每秒50K记录插入。每秒两次的几个日志条目不应导致显着的减速。

答案 1 :(得分:5)

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

  • 计算到目前为止插入的记录数
  • 开始交易
  • 插入记录
  • 增量计数
  • 插入N条记录时提交/结束交易
  • 重复

缺点是,如果系统在此期间崩溃,您可能会丢失未提交的记录(但如果您愿意使用内存数据库,那么听起来您可能会对此风险感到满意。)< / p>

答案 2 :(得分:2)

对SQLite文档的简要搜索没有任何用处(不太可能,我没想到)。

为什么不使用每10分钟唤醒一次的后台线程,将所有日志行从内存数据库复制到外部数据库(并从内存数据库中删除它们)。当您的程序准备结束时,最后一次唤醒后台线程以保存最后的日志,然后关闭所有连接。