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