我有一个应用程序,它一直运行并收到一些消息(它们的速率从每秒几个到每小时不变)。每条消息都应放入SQLite数据库中。最好的方法是什么?
在每条消息上打开和关闭数据库听起来不太好:如果每秒有几十条消息,它将会非常慢。
另一方面,打开数据库一次并只是写入数据库可能会导致数据丢失,如果进程意外终止。
答案 0 :(得分:2)
听起来就像你做的一样,你必须做出权衡。
如果安全是您最关心的问题,那么请在每条消息上更新数据库并快速点击。
如果您想要妥协,那么更新数据库会写入所有这么多消息。例如,维护一个缓冲区和每100条消息,发出一个包含在事务中的更新。
事务包装很重要,原因有两个。首先,它最大化速度。其次,如果您使用日志记录,它可以帮助您从错误中恢复。
如果您执行上述批量更新,则可以通过记录每条消息到文件时添加额外的安全级别。每次成功发出数据库更新时,您都将重置此日志。这样,如果更新失败,您知道它在整个块上失败(因为您正在使用事务),并且您的日志将具有未更新的信息。这将允许您重新发布更新,甚至可以查看导致失败的数据是否存在问题。这当然假设保存日志比更新数据库便宜,这可能是这种情况,具体取决于您的连接方式。
答案 1 :(得分:0)
如果您的最高费率是“每秒几个”,那么我不会看到打开和关闭数据库的真正问题。如果在服务器发生故障的情况下立即记录数据至关重要,则尤其如此。
我们在报告产品中使用SQLite,我们能够实现的最佳性能是一次以数千个块的形式记录行。我们的默认设置是50k左右。这意味着我们的应用程序会等待,直到收集到50k行数据,然后将其作为一个事务提交。
答案 2 :(得分:0)
有一种简单的算法可以根据消息速率调整应用程序的行为:
以这种方式,每条消息都会立即保存,除非消息率过高。
注意:关闭数据库不会增加数据持久性(这就是事务提交的目的),它只会释放一点内存。