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

时间:2011-08-27 00:27:05

标签: c# sqlite in-memory-database

我有一个SQLite数据库,它具有非常密集的重复读取和偶尔的写入。但是,写入(因为索引)倾向于阻止读取。我想将磁盘上的数据库读入内存数据库,然后在机器完全空闲5到10秒后,有一种同步回磁盘的方法。我简单地试图将附加的磁盘数据库中的表复制到内存数据库中,但似乎应该有更好的方法。我还考虑了当机器空闲时提交的事务(但这会阻止密集读取)。读取包括要更新(或插入)的表,但写入不是时间敏感的。

2 个答案:

答案 0 :(得分:1)

您应该升级到SQLite 3.7.0或更高版本,其中包括Write Ahead Logging。这种新的锁定方法允许在写入时进行读取。

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

要在内存数据库和磁盘数据库之间进行复制,您可以使用备份API,但它尚未通过.NET包装器公开。

此外,通过增加缓存大小,您可以从磁盘数据库获得与内存数据库相同的性能 - 整个内容可以缓存在内存中。

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

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

答案 1 :(得分:1)

如果可以选择商业图书馆 - 请参阅http://www.devart.com/dotconnect/sqlite/

它(以及其他内容)支持内存数据库,并且有一个组件SQLiteDump,它基本上允许你做你所描述的...它也带有ADO.NET DataSet / {{1支持,LINQ,PLINQ,EF等,并支持最新的SQListe版本......