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

问题描述:

我正在编写一个应用程序,它必须很频繁地记录信息,比如每秒两次。我希望将信息保存到sqlite数据库,但我不介意每十分钟对磁盘进行一次更改。将sqlite数据库从内存同步到文件

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

一个可选的解决方案是使用的内存数据库(它会适合,没有后顾之忧),它不时同步到磁盘,

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

我可以用QtSQL包装来解决吗?

假设您有一个名为'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的记录插入。每秒两次的日志条目不应导致显着的减速。

对SQLite文档的简短搜索没有任何用处(这不太可能,我也没有料到它)。

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

+0

因为那么我需要创建日志,记住我已经保存的日志的哪一部分,维护后台线程,并在很大程度上来说实现同步自己。这是可能的,但我想避免这种情况。 – 2010-06-22 20:31:43

+0

让我知道你最终如何解决这个问题。 – 2010-06-24 01:05:44

如果您在自己的事务中执行每个插入 - 这可能是您看到的缓慢起落的重要原因。也许你可以:

  • 计数迄今插入的记录数
  • 开始事务
  • 将您记录
  • 增量当N记录已经被插入
  • 提交/结束交易
  • 重复

缺点是,如果系统cr在此期间灰烬可能会失去未提交的记录(但如果您愿意使用内存数据库,则听起来您可以承担这种风险)。