正确使用基于xml文件的存储作为ASP.NET站点中的数据库替代方案

时间:2009-11-20 16:10:43

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

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

在这种情况下,网站受众仅限于朋友和家人 - 只需要几个并发用户,因此网站需要扩展。在所有交易中从字面上逐字打开和关闭xml文件是否可行?最多一个页面可能会显示来自几个xml文件的数据,有时用户会执行需要更新一个文件的操作。

例如,大致遵循用于获取和保存“Things”的存储库模式,一些方法需要:

    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);
    }

这种方法有任何陷阱或问题吗?我宁愿避免添加额外的缓存或内存数据层的额外复杂性。额外信用:在用户负载或交易级别的哪个位置确实认为需要以不同方式实施?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

在调用Load方面 - 您可以在每次点击时执行此操作,服务器甚至不会闪烁我们的网站实际上做得非常多(加载XML,使用XSLT渲染到HTML和基于URL的参数,提供给浏览器,XSLT的加载是显式的或者通过变换渲染调用隐含的XML)我们只是看不到它们的问题,你需要并发用户进入100s才能开始成为一个问题在阅读数据时。

在执行文件写入(保存)方面 - 不知道,但我不认为这是一个巨大的问题,处理并发(无论如何是一个问题)将会让我关注的远不止于服务器负载,在您的使用级别,创建性地使用应用程序锁定可能就足够了,对于任何严重的情况,这都是使用XML作为数据库的挑战。

除此之外,这是一个ASP.NET显而易见的领域 - 服务器端代码的性能 - 在一般情况下 - 是优秀的(可能太好了)。