我有一个SQLite数据库,它有相当密集的重复读取和偶尔的写入。但是,写入(由于索引)往往会阻塞读取。我希望将磁盘上的数据库读取到内存中的数据库中,然后在机器完全空闲5-10秒时有一种方法可以同步回磁盘上。我曾一度想将表从附加的磁盘数据库复制到内存数据库,但似乎应该有更好的方法。我还考虑了当机器空闲时提交的事务(但这会阻止密集读取)。读取包括要更新(或插入)的表,但写入不是时间敏感的。
发布于 2011-08-27 12:07:54
您应该升级到包含预写日志的SQLite 3.7.0或更高版本。这种新的锁定方法允许边写边读。
http://www.sqlite.org/draft/wal.html
要在内存中的数据库和磁盘上的数据库之间进行复制,您可以使用backup API,但它还没有通过.NET包装器公开。
此外,通过增加缓存大小,您可以从磁盘上的数据库中获得与内存中数据库相同的性能--整个内容都可以缓存在内存中。
另一种选择是使用甲骨文的新版本BerkleyDB,它有一个SQLite前端,包括相同的.NET包装器,是官方SQLite版本的临时替代品。他们更改了锁定机制,以支持页级别的锁,而不是数据库级别的锁,并极大地提高了并发性,从而提高了多连接性能。我自己没有用过它,但我读了一些好东西。
http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html
发布于 2011-08-27 12:28:39
如果可以选择商业库,请参阅http://www.devart.com/dotconnect/sqlite/
它(在其他方面)支持in-memory-DB,并且有一个组件SQLiteDump,它基本上允许执行您所描述的操作……它还支持ADO.NET DataSet/DataTable,LINQ,PLINQ,EF等,并支持最新的SQListe版本...
https://stackoverflow.com/questions/7211739
复制相似问题