Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将磁盘上的SQLite数据库加载到内存中的数据库并同步回_C#_Sqlite_In Memory Database - Fatal编程技术网

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

C# 将磁盘上的SQLite数据库加载到内存中的数据库并同步回,c#,sqlite,in-memory-database,C#,Sqlite,In Memory Database,我有一个SQLite数据库,它有非常密集的重复读取和偶尔写入。但是,写入(因为索引)往往会阻止读取。我想将磁盘上的数据库读入内存中的数据库,然后在机器完全空闲5-10秒时,有一种方法可以同步回磁盘上的数据库。我曾一度尝试将表从连接的磁盘数据库复制到内存数据库,但似乎应该有更好的方法。我还考虑了在机器空闲时提交的事务(但这会阻止密集读取)。读取包括要更新(或插入)的表,但写入不具有时间敏感性。您应该升级到SQLite 3.7.0或更高版本,其中包括预写日志记录。这种新的锁定方法允许边写边读 要在

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

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

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

另外,通过增加缓存大小,您可以从磁盘上的数据库获得与内存中数据库相同的性能——整个过程都可以缓存在内存中

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


如果选择商业图书馆,请参阅


它(除其他外)支持内存中的DB,并有一个组件SQLiteDump,它基本上允许执行您描述的操作。。。它还附带ADO.NET
DataSet
/
DataTable
支持、LINQ、PLINQ、EF等,并支持最新的SQListe版本……

您是否可以选择切换到更健壮的数据库?不幸的是,短期内不会。因此,换句话说,它所做的一切,免费版本也都可以,一些免费版本通过不同的锁定模型提供更好的并发性。太好了,我不太明白你的意思。。。我既没有列出所有的功能,也不认为我应该(只是一个快乐的客户,没有别的)-我只是指出OP可能会发现对他所描述的有用的功能。。。关于锁定模型,AFAIK it支持SQLite必须提供的所有模型……正如我在回答中提到的,Oracle BerkleyDB版本(我没有使用)有一个替代锁定模型,该模型是该版本独有的,并提供了极大的并发性改进。我对你的回答的问题是,它们列出了与问题不相关的功能,并暗示这些功能只存在于商业版本中。我认为这两个方面都存在问题。。。OP明确表示,他不能更改为SQLite以外的其他版本(请参见上面的评论)…没错,但我提到的BerkleyDB版本是SQLite的一个端口;替代品的减少。它还解决了上述问题。
Oracle的新版本BerkleyDB。。。是SQLite官方版本的替代品。
是否可以删除单个可执行文件?@Tim,它是dll的集合,没有可执行文件。SQLite与主机应用程序在进程中运行。