将磁盘上的SQLite数据库加载到内存数据库中并同步回来

本文关键字:数据库 内存 回来 同步 加载 磁盘 SQLite | 更新日期: 2023-09-27 18:06:59

我有一个SQLite数据库,它有相当密集的重复读取和偶尔的写入。然而,写操作(因为索引)往往会阻塞读操作。我希望将磁盘上的数据库读取到内存中的数据库中,然后在机器完全空闲时(可能是5-10秒)有一种同步回磁盘上的方法。我一度想将表从附加的磁盘数据库复制到内存数据库,但似乎应该有更好的方法。我还考虑了在机器空闲时提交的事务(但是这会阻塞密集读取吗)。读操作包括要更新(或插入)的表,但写操作对时间不敏感。

将磁盘上的SQLite数据库加载到内存数据库中并同步回来

您应该升级到SQLite 3.7.0或更高版本,其中包括预写日志记录。这种新的锁方法允许在写的同时读。

http://www.sqlite.org/draft/wal.html

要在内存数据库和磁盘数据库之间进行复制,您可以使用备份API,但它还没有通过。net包装器暴露。

此外,通过增加缓存大小,您可以从磁盘上的数据库获得与内存中数据库相同的性能——所有的东西都可以缓存在内存中。

另一个选择是使用Oracle的新版本BerkleyDB,它有一个SQLite前端,包括相同的。net包装器,是官方SQLite版本的替代品。他们更改了锁定机制,以支持页级锁而不是数据库级锁,并大大提高了并发性,从而提高了多连接性能。我自己没用过,但我读过一些好东西。

http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

如果一个商业库是一个选项-参见http://www.devart.com/dotconnect/sqlite/

它(除其他外)支持内存db,并有一个组件SQLiteDump,基本上允许做你所描述的…它还带有ADO。. NET DataSet/DataTable支持,LINQ, PLINQ, EF等,并支持最新的sqlist版本…