许多小写到SQLite

时间:2012-12-03 15:50:36

标签: sqlite

我有一个应用程序,它一直运行并收到一些消息(它们的速率从每秒几个到每小时不变)。每条消息都应放入SQLite数据库中。最好的方法是什么?

在每条消息上打开和关闭数据库听起来不太好:如果每秒有几十条消息,它将会非常慢。

另一方面,打开数据库一次并只是写入数据库可能会导致数据丢失,如果进程意外终止。

3 个答案:

答案 0 :(得分:2)

听起来就像你做的一样,你必须做出权衡。

如果安全是您最关心的问题,那么请在每条消息上更新数据库并快速点击。

如果您想要妥协,那么更新数据库会写入所有这么多消息。例如,维护一个缓冲区和每100条消息,发出一个包含在事务中的更新。

事务包装很重要,原因有两个。首先,它最大化速度。其次,如果您使用日志记录,它可以帮助您从错误中恢复。

如果您执行上述批量更新,则可以通过记录每条消息到文件时添加额外的安全级别。每次成功发出数据库更新时,您都将重置此日志。这样,如果更新失败,您知道它在整个块上失败(因为您正在使用事务),并且您的日志将具有未更新的信息。这将允许您重新发布更新,甚至可以查看导致失败的数据是否存在问题。这当然假设保存日志比更新数据库便宜,这可能是这种情况,具体取决于您的连接方式。

答案 1 :(得分:0)

如果您的最高费率是“每秒几个”,那么我不会看到打开和关闭数据库的真正问题。如果在服务器发生故障的情况下立即记录数据至关重要,则尤其如此。

我们在报告产品中使用SQLite,我们能够实现的最佳性能是一次以数千个块的形式记录行。我们的默认设置是50k左右。这意味着我们的应用程序会等待,直到收集到50k行数据,然后将其作为一个事务提交。

答案 2 :(得分:0)

有一种简单的算法可以根据消息速率调整应用程序的行为:

  • 刚刚撰写邮件时,请检查是否有新邮件。
    • 如果是,请写下该消息,然后重复。
  • 仅当您用完了立即可用的消息时,才提交事务并关闭数据库。

以这种方式,每条消息都会立即保存,除非消息率过高。

注意:关闭数据库不会增加数据持久性(这就是事务提交的目的),它只会释放一点内存。