Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于文件的服务和并发问题_C#_File_Architecture_Concurrency - Fatal编程技术网

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

C# 基于文件的服务和并发问题,c#,file,architecture,concurrency,C#,File,Architecture,Concurrency,我正在为一组WCF服务设计架构。由于这些服务部署的性质(远程部署到客户端站点上的许多不可管理系统上,因此我们无法承担数据库服务器的管理开销),数据存储必须基于文件(我们在文件格式上非常倾向于XML) 再一次,服务的性质意味着在单个文件中存在并发问题的可能性,我正在尝试设计一个在所有实例中都能正常运行的系统,并避免在有写操作挂起时尝试读取数据 我目前的想法是采取两种可能的途径之一 锁定文件 这将按以下方式操作。 所有文件操作都将具有锁定机制。读取将在请求数据之前进行检查,以确保所需文件当前未被锁定

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

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

我目前的想法是采取两种可能的途径之一

  • 锁定文件

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

  • 在后台为服务提供数据的附加程序

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


  • 在实现创建这类服务的目标的两种(或可能的其他)方法中,哪种方法能够提供最大的性能,同时并发冲突的可能性最小?选项1设计的简单性意味着我更支持它,但我担心“睡眠”操作可能会影响性能。

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

    另一种选择是类似SQLLite的东西。它只需要在应用程序中部署几个dll。没有任何开销,但拥有一个数据库比自己管理所有文件访问更有益


    sqllite、MySQL甚至sqlexpress都非常小和轻量级,它们被用作手持设备上的数据存储,所以我不明白为什么这样的东西在这里不起作用

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

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

    您可以从面向桌面的功能(如安静安装和附加的db文件)中获益


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

    签出。它不需要任何正在运行的服务,并且支持XCopy部署。

    数据库是对一组文件的抽象。他们要求你以一小部分的成本重新发明轮子。我认为您确实需要回过头来解释尝试编写自己的数据库所带来的业务影响—这将花费更长的时间,成本更高,可靠性也更低。

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

    SQL Server Express的管理开销太大了?这只是一个想法,但据称SQL Server Compact支持多个并发连接和事务,应该可以由xcopy或类似工具部署:我同意db是更好的解决方案,但权力机构已经规定,在后端除了平面文件之外,不会有其他数据存储。我曾试图说服他们不要这样做,但这不会发生(你有没有告诉他们,一个数据库实际上是他们想要你建立的东西的成熟版本,而且是一个便宜货?我完全理解这个论点,但权力机构已经决定不需要数据库,只需要文件。考虑到这个限制(相信我,我已经试图推翻这个限制)我被上面列出的两个选项困住了。不过,我想我必须问一下。他们不想要它的原因是,他们想用记事本来检查文件吗?如果您使用像SQLLite这样的东西,它只是一个或两个额外的dll和一个文件,那么它们怎么会更明智呢。有时候你必须做正确的事。总的来说,请求原谅比允许方式要好。或者他们需要真正弄清楚为什么他们想要一个平面文件系统,然后浪费时间和金钱重新发明轮子。Sql Lite是开源的,因此您可以重新调整代码本身的用途。:)谢谢你的“锁定时崩溃”问题,亨克。这可能是说服管理层我们需要采用db解决方案的又一个理由。