1

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

4

2 回答 2

2

您应该升级到包含预写日志记录的 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

于 2011-08-27T04:07:54.140 回答
1

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

它(除其他外)支持内存数据库,并有一个组件 SQLiteDump,它基本上允许做你描述的事情......它还带有 ADO.NET DataSet/DataTable支持、LINQ、PLINQ、EF 等并支持最新的 SQListe 版本...

于 2011-08-27T04:28:38.560 回答