【问题标题】:C# embedded Db with concurrency and mono support具有并发和单声道支持的 C# 嵌入式 Db
【发布时间】:2012-07-22 23:47:27
【问题描述】:

我正在编写一个服务,它需要一个嵌入式数据库来存储基本信息(id、插入日期、上次更新以及我将返回的大量实际数据)。我将有多个线程同时读取不同的行,并且至少有 1 个线程同时对行进行更新。我更喜欢多个线程进行更新的选项,但我可以只使用一个线程进行更新。基本上这是一个缓存服务,但通常我 99% 的数据将在缓存中,我可以有一个线程来填充缺少的内容,因为它是一个服务的缓存,它限制了每分钟的请求数,因此缓存了所有数据.

我希望能够在 Windows 或 linux 上运行它,因此必须支持 dotnet 和 mono,但我看过的几乎所有嵌入式数据库都不支持并发,这对我来说是必须的。对象数据库或sql数据库,只要能和dotnet很好的结合,我就不行了。

我希望有人在类似情况下需要具有并发支持的嵌入式数据库。此外,如果可能的话,我更喜欢免费(成本明智)的数据库,因为这只是现阶段家庭的个人项目。

我查看了许多数据库(STSdb、SQL CE、Firebird、codeplex 上的一堆开源数据库),但它们要么不能在 mono/linux 上工作,要么似乎不支持并发。

【问题讨论】:

    标签: .net database concurrency mono


    【解决方案1】:

    您可以使用 SQLite,它在 Mono (http://www.mono-project.com/SQLite) 上不受支持,并且它支持并发,引用自 FAQ 问题 5:

    Q:可以多个应用程序或多个实例同一个吗 应用程序同时访问一个数据库文件?

    A: 多个进程可以同时打开同一个数据库。 多个进程可以同时执行 SELECT。但只有 一个进程可以随时更改数据库 然而,时间。

    【讨论】:

    • 我目前正在研究 SQLite。关于它的并发性,我唯一要指出的是这一点。现在在 doco 中找不到它,但是我正在阅读的页面之一说线程很糟糕,虽然它确实支持并发,但似乎是通过将实例限制为内部一个线程来实现的。
    • 也就是说,将其内部限制为数据库中的一个线程可能不是什么大问题,因为数据库应该很快。根据操作系统,你不需要不同的 DLL 或 sqlite 的东西吗?到目前为止,这似乎是最好的选择
    • 是的,您将需要不同的二进制文件(*.dll 或 *.so)查看 Mono 项目 SQLite 页面的先决条件。我不知道这种“单线程”限制(sqlite.org/cvstrac/wiki?p=MultiThreadingsqlite.phxsoftware.com/forums/t/56.aspx
    • Form that link "The ADO.NET wrapper 有内置的重试和超时机制来处理这些场景,但是如果您使用多个线程并尝试将读取与写入或写入混合使用读一读,你就会陷入僵局。”我会收到很多阅读,而我可能正在写作,这是现阶段唯一让我担心 sqlite 的事情。
    • 我对多线程环境中的 SQLite 没有太多经验,抱歉。但我真的认为 SQLite 是你最好的选择
    【解决方案2】:

    我们在谈论多少数据?
    需要数据库吗?

    如果它只是一个“表”,您是否可以只编写一个使用文件系统的小层,每行一个名为 id-createdDate-updatedDate 的文件夹,然后在其中放入一个文本文件?你仍然会得到并发读取和有限的写入

    【讨论】:

    • 我将有大约 100k 行。我打算使用文件系统来存储文件,因为我主要通过 ID 查找内容,但我还需要能够根据存储在记录中的日期等快速找到上周未更新的记录,所以我认为数据库会更好。 (文件数据库只要有某种索引就可以)
    【解决方案3】:

    自从第一次提出这个问题以来,一个变化是您现在可以使用 .NET 异步和等待功能,因此无法进行并发写入不太可能导致瓶颈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多