【问题标题】:Proper usage of xml file-based storage as database alternative in ASP.NET site正确使用基于 xml 文件的存储作为 ASP.NET 站点中的数据库替代方案
【发布时间】:2010-12-18 19:05:45
【问题描述】:

我正在构建一个小型应用程序并降低托管成本和依赖性,我计划将所有持久数据存储到 xml 文件而不是 Sql Server 数据库。

在这种情况下,网站受众仅限于朋友和家人 - 预计不会超过几个并发用户,因此网站不需要扩展。在所有事务中从磁盘打开和关闭 xml 文件是否可行?一个页面最多可以显示来自几个 xml 文件的数据,偶尔用户会执行需要更新一个的操作。

例如,大致遵循存储库模式来获取和保存“事物”,一些方法可能如下:

    public IEnumerable<Thing> GetThings() {
        XElement xml = XElement.Load(_xmlRepositoryPath);
        var q = from s in xml.Descendants("Thing")
                select new Thing {
                    //set properties...
                };

        return q;
    }

    public void SaveThing(Thing t) {
        XElement xml = XElement.Load(_xmlRepositoryPath);
        //update xml...
        xml.Save(_xmlRepositoryPath);
    }

这种方法有什么陷阱或问题吗?我宁愿避免添加额外的缓存或内存数据层的额外复杂性。额外的功劳:在用户负载或交易水平的什么时候,您认为需要以不同的方式实施?

【问题讨论】:

  • 为什么要避免使用 SQL?如果您出于成本/许可原因而避免使用 MS SQL Server,那么 SQLite 是一个非常好的轻量级替代方案。如果您避免使用 SQL 以保持简单,是的,XML 可能是一个不错的选择。
  • 由于托管成本而避免使用 SQL,但看起来 SQLite 是一种选择 - 我将不得不考虑这一点,谢谢!

标签: asp.net xml .net-3.5 linq-to-xml


【解决方案1】:

数据库将提供而文件系统不会提供的主要内容是[原子性](http://en.wikipedia.org/wiki/Atomicity_(database_systems%29). 一旦您有多个人访问您的 xml 文件,您需要实施 ReaderWriter 锁以确保在您尝试更新文件时没有人在阅读。这是一个不平凡的问题,但大多数数据库系统都解决了这个问题。 如果您关心成本,那么有很多开源解决方案。

无论您决定采用何种解决方案,请确保封装所有数据访问,以便更改它不会那么困难。

【讨论】:

    【解决方案2】:

    在调用 Load 方面 - 您可以在每次点击时执行此操作,并且服务器甚至不会闪烁我们的网站正在有效地执行此操作(加载 XML、使用 XSLT 渲染为 HTML 以及基于 URL 的参数,交付给浏览器,XSLT 的负载是显式的,或者是通过转换调用渲染所隐含的 XML),我们只是看不到它们有问题,您需要并发用户数达到 100 才能开始成为问题读取数据时。

    在执行文件写入(保存)方面 - 不知道,但我不认为这是一个大问题,处理并发(无论如何都是一个问题)将是比我更关心的事情服务器负载,在您的使用水平上,创造性地使用应用程序锁可能就足够了,对于任何严重的事情来说,这就是使用 XML 作为数据库变得具有挑战性的地方。

    顺便说一句,这是一个 ASP.NET 明显摇摆不定的领域 - 服务器端代码的性能 - 在一般情况下 - 优秀(可能太好了)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2010-10-15
      • 1970-01-01
      • 2020-09-06
      • 2012-01-31
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多