【问题标题】:Synchronizing sqlite database from memory to file将sqlite数据库从内存同步到文件
【发布时间】:2010-06-22 15:37:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: database qt sqlite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      • 统计到目前为止插入的记录数
      • 开始交易
      • 插入您的记录
      • 递增计数
      • 插入 N 条记录后提交/结束事务
      • 重复

      不利的一面是,如果系统在此期间崩溃,您可能会丢失未提交的记录(但如果您愿意使用内存数据库,那么听起来您可以接受这种风险)。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 因为那时我需要创建日志,记住我已经保存的日志的哪一部分,维护后台线程,并且很大程度上自己实现同步。这是可能的,但我想避免这种情况。
        猜你喜欢
        • 1970-01-01
        • 2011-02-14
        • 2021-06-05
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        相关资源
        最近更新 更多