代码之家  ›  专栏  ›  技术社区  ›  ZombieSheep

基于文件的服务和并发问题

  •  1
  • ZombieSheep  · 技术社区  · 16 年前

    我正在为一组WCF服务设计体系结构。由于部署这些服务的性质(远程部署到客户机站点上的许多不可管理的系统上,因此我们负担不起数据库服务器的管理开销),数据存储必须基于文件(对于文件格式,我们非常倾向于XML)。

    再次说明,服务的性质意味着在单个文件中可能存在并发问题,我正在尝试设计一个在所有情况下都能正常工作的系统,并避免在写操作挂起时尝试读取数据。

    我目前的想法是走两条可能的路线之一。

    1. 锁定文件

      这将按以下方式操作。 所有文件操作都将具有锁定机制。在请求数据之前,读取将检查以确保所需文件当前未被锁定。如果文件被锁定,则服务应睡眠随机数毫秒(在尚未确定的范围内)。写操作将设置锁,提交数据,然后解锁文件。

    2. 后台提供数据给服务的附加程序

      这个版本将在后台有一个辅助应用程序,公开各种公共静态方法,这些方法可由服务调用。后台应用程序将全权负责维护数据的内存表示,向服务提供数据,并使文件副本与内存中的对象保持同步。在这方面,它的行为就像是一个事务化的数据库服务器。

    在实现创建这些类型服务的目标的两种(或可能是其他)方法中,哪种方法将以最少的并发冲突机会提供最大的性能?选项1设计的简单性意味着我更喜欢它,但我担心“睡眠”操作可能会影响性能。

    5 回复  |  直到 13 年前
        1
  •  1
  •   Joshua Cauble    16 年前

    我知道您说过您不希望数据库服务器的管理开销,但是为什么不使用类似SQL Express的东西呢?您只需要安装运行时。使用Access数据库文件也是如此。只需要一个运行时。然后,您可以绕过这些其他问题,只需确保将运行时作为安装程序所需组件的一部分。我认为这将使您的生活更容易,并且您不会有真正的数据库服务器的开销。

    另一个选项是类似SQL Lite的东西。它只需要在应用程序中部署几个DLL。没有任何开销,除了拥有一个数据库而不用自己管理所有的文件访问。

    sql-lite、mysql甚至sql-express都非常小巧轻便,可以作为手持设备上的数据存储,所以我不明白为什么像这样的东西在这里不起作用。

        2
  •  1
  •   Henk Holterman    16 年前

    我会把约翰桑德斯的评论变成一个答案:

    与简单安装SQL Express相比,这两个选项很可能都需要更多的管理开销。

    您可以从桌面功能中获益,如安静安装和附加的数据库文件。

    关于1),如果文件被锁定时发生崩溃会发生什么?

        3
  •  0
  •   Manu JCasso    16 年前

    退房 SQL Server Compact edition . 它不需要任何正在运行的服务,并且支持xcopy部署。

        4
  •  0
  •   Winston Smith    16 年前

    数据库是对一组文件的抽象。他们要求你以一小部分的成本重新改造车轮。我认为你真的需要把这一点往后推,解释一下尝试编写自己的数据库对业务的影响——这将花费更长的时间,成本更高,可靠性更低。

        5
  •  0
  •   kyoryu    16 年前

    如果您真的需要直接写入文件系统,我建议您让服务对象与服务上承载的维护文件权限的对象进行对话,而不是让多个对象直接访问该文件。然后,您可以适当地锁定该对象以保持一致性。