【问题标题】:Which data store for a management service like IIS用于 IIS 等管理服务的数据存储
【发布时间】:2011-04-08 15:36:54
【问题描述】:

我有一个 C# Windows 服务,它为我的服务器应用程序管理一些东西。这不是主应用程序,而是用于控制我的实际应用程序的辅助进程。用户使用 WinForms 应用程序通过 WCF 连接到此应用程序。这一切看起来有点像 IIS 管理器。

我需要此应用程序的数据存储。

目前,我使用单独的 XML 文件,这些文件在启动时加载,在内存中更新并在每次更改时刷新到磁盘。我喜欢这个,因为:

  • 出现问题时,我们可以简单地在记事本中编辑 XML 文件;
  • 我没有外部依赖项,例如MSSQL 快递;
  • 当格式更改时,我不必更新数据库架构。

但是,我发现这并不稳定,并且内存管理非常脆弱。

我应该使用什么而不是过度杀伤(例如 MSSQL express 会)而不失去太多上述优势?

【问题讨论】:

  • 其中哪一部分不稳定?你得到什么错误?您遇到了什么样的内存管理问题?
  • 您的 XML 文件应该可以满足您的要求。什么是“不稳定”和“脆弱”呢?我希望改进您​​的 IO,而不是寻找新技术。
  • 您是否看过 SQL Server Compact,在您的情况下听起来是个好主意,唯一的缺点是架构更改,但老实说这种情况发生的频率以及更改的复杂程度,也许先看看 EF 代码每次发生变化时更新您的架构(虽然很可能会丢失数据)
  • 我在管理不同的文件时遇到了最大的问题。我曾尝试使用单个全局 lock,但这太过分了,转向更细粒度的模型会使应用程序的这一部分过于复杂。 (我觉得我在建一个数据库,这不太好。)

标签: c# .net


【解决方案1】:

SQLite 适用于需要可靠数据存储但不需要完整数据库服务器的强大功能或可扩展性的此类场合。

如果您不想担心架构更改,您最好使用 xml 方法或某种 NoSQL 数据库。你的 xml 设置到底有什么不稳定的地方?

如果您有多个并发进程访问 xml 文件,则必须经常加载它以确保它保持同步。如果这是多用户情况,xml 文件在非常小的范围内可能不可行。这是数据库系统相当有效地解决的问题。

【讨论】:

  • 我在管理不同的文件时遇到了最大的问题。我曾尝试使用单个全局锁,但这太过分了,并且转向更细粒度的模型会使应用程序的这一部分过于复杂。 (我觉得我正在构建一个数据库,这并不好。)我也在考虑 NoSQL,但我希望针对我的情况提出一个建议,即 .NET 原生而无需安装额外的服务器。
  • 我建议查看 RavenDB (ravendb.net)。我没有亲自使用过它,但我知道它相当成熟,并且在 .NET 中很容易使用
【解决方案2】:

试试SQL CESQLLite

【讨论】:

    【解决方案3】:

    db4o

    一种解决方案是使用像dB4o 这样的对象数据库。它占用空间极小,速度极快,并且您可以向持久对象添加属性而无需进行架构更改。另外,你不必写任何sql。

    存储对象很简单:

    using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
    {
       Pilot pilot1 = new Pilot("Michael Schumacher", 100);
       db.Store(pilot1);
    }
    

    数据库中的 XML

    另一种方法是结合 xml 数据使用 SQLLite 或 SQL CE(正如其他海报所提到的)之类的东西。

    数据协定序列化器

    如果您还没有使用 DataContractSerializer / DataContracts 来生成/加载您的 xml 文件,那么值得考虑。它与您已经用于 WCF 的强大框架相同。它可以很好地处理版本控制。您可以使用它来处理磁盘上的 xml 文件,或者将其与数据库一起使用。

    【讨论】:

    • XML和SQLite的结合是什么意思?我正在考虑创建一个可以将 XML 节点和属性存储为记录的数据库结构。你怎么看?
    • @Pieter - 我更多地考虑将 xml 作为一个大字符串放入数据库。几乎所有的嵌入式数据库都支持某种大型文本字段/备忘录字段等。如果您尝试将节点和属性分解为关系结构,您将遇到性能和复杂性问题。
    • 性能不是问题,因为数据很少(约 30 个 XML 文件,总共 600 个元素/属性)。复杂性,也许。使用 XML blob,我仍然需要一种方法来索引数据,这意味着我需要一个规范化的模式,我又回到了 SQLite。
    • 还有其他一些选择... NoSQL 嵌入式方法怎么样。 ESENT 内置在 Windows 中。 RavenDB 也可以工作。这个问题还有更多答案:stackoverflow.com/questions/2081080/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多